
sedパターンマッチングを使用して、ASCII 10進表現をカンマ区切りリストに置き換えたいと思います。パターンをcsv整数文字列に変換する操作は、bash関数内で行われます。関数は私の役割を果たしていますが、sed呼び出しに統合するのに問題があります。サンプルコードは次のとおりです。
#!/bin/bash
xx(){
##turns a string into its
##ascii-integer representation as a comma-separated list
##ignores double quotes at the start and end
n=0;o=""
for((k=1;k<$(echo $1 | wc -c);k++))
do
x=$(echo $1 | cut -b"$k")
a=$(printf '%d\n' "'$x" )
if [ $a = 34 ]
then
continue
else
n=$(($n+1))
if [ $n = 1 ]
then
o=$a
else
o=$(echo $o","$a)
fi
fi
done
o=$(echo '('$o')')
echo $o
}
##this works
xx "\"bla\""
##this does not work
y=$(echo "\"bla_x\"" | sed -e "s/bla/$(xx &)p")
機能は機能しますが、sed 統合は失敗します。インターネット検索でこれが原則として可能でなければならないという印象を受けたので、おそらく小さな構文エラーかもしれません。
どんな助けでも大変感謝します。
みんな一番いい
注:最終アプリケーションでは、sedへの入力はreg-expパターン(「k_ [[:alnum:]] {5}」など)を持つファイルで、csv接続に置き換えられます。したがって、最終的に "xx" は sed から呼び出す必要があります。
答え1
sed呼び出しを注意深く見てください。 s///コマンドのクローズスラッシュがありません。次に二重引用符を使用するので、sedが実行される前にも二重引用符の補間がs / / /コマンドのrhsを埋めます。あなたが望むものではありませんか?しかし、それでもゴールを越えることはできません。
/e
コマンドにはよく知られていない記号がありますGNU sed's s///
。この場合、医師が指示したのがこれである。これは、rhs実行時に提供されたシェルコードに基づいてs / / /コマンドのrhsを動的に設定し、それを出力に置き換えることです。注:パターン領域全体が一致する必要があります。
また、子供が使用できるようにカスタム関数をエクスポートする必要があります。
#this does not work
##this is what YOU wrote
y=$(echo "\"bla_x\"" |
sed -e "s/bla/$(xx &)p")
##this now WORKS
export -f xx
y=$(
echo '"bla_x"' |
sed -Ee '
s/^.(.*)(_x).$/echo "$(xx '"\1"')\2"/e
'
)
echo "$y"
(98,108,97)_x
sedコマンドで一重引用符を使用することに注意してください。
答え2
私が正しく理解したら、以下を使用して機能を簡素化できますprintf
。
xx() {
# create an array to store every character of the word
declare -a arr
# loop the word to every char, removing quotes
for i in $(echo "${1//\"}" | grep -o .); do
# store the ascii value
arr+=($(printf "%d" "'$i"))
done
# create a variable with the values, comma separated
printf -v ascii "%s," "${arr[@]}"
# print the result adding the parenthesis and removing the last comma
echo "(${ascii%,})"
}
$ xx "\"bla\""
(98,108,97)
これでxx
二重引用符を削除しますが、sed
コマンドから引用符のないパターン(「bla」ではなくbla)を送信しようとしているので、次のコードの出力に二重引用符が表示されたくない場合は削除する必要があります。他の方法:
p=bla
s="\"bla_x\""
c=$(xx "$p")
$ echo "$s" | sed "s/$p/$c/"
"(98,108,97)_x"