sed: bash 機能を使用した置換パターンの出力

sed: bash 機能を使用した置換パターンの出力

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コマンドで一重引用符を使用することに注意してください。

おすすめ記事