
以下のコードは出力する必要がありますひも
LANG=C ;
echo 'aString12 theString34 otherString56' | \
sed "s;aString12 \(theString34\) anotherString56;$(printf '%s' "\1" | sed 's;[0-9]\{2\}$;;');"
...しかし出力されますストリング34。これ34取り除かなければならない| sed;[0-9]{2}$;;');しかしそれは真実ではない。
この問題はその部分だけを変更して解決する必要があり、$(printf '%s' "\1" | sed 's;[0-9]\{2\}$;;')
コードのその部分を変数に置き換えて解決しないでください。
よろしくお願いします。
答え1
sed
問題は、コマンドが開始される前に含まれるコマンド置換が実行されることです。シェルが呼び出すパラメータを見つけたときに実行されますsed
。
sed
内部で外部ユーティリティを呼び出すのではなく、使用する必要がある文字列部分を分割し、2番目の置換コマンドを使用して変更できます。
echo 'aString12 theString34 otherString56' |
sed -e 's/aString12 \(theString34\) otherString56/\1/' \
-e 's/[0-9]\{2\}$//'
これにより、行全体が最初の式でキャプチャされた部分に置き換えられ、2番目の置換がバッファの残りの部分に適用されます。
!b
最初の置換が何かを行うときに2番目の置換のみを適用するには、最初に式を一致させ、一致しない場合はスクリプトの末尾に分岐できます(使用)。その場合した一致させるには、2つの代替を適用します。
echo 'aString12 theString34 otherString56' |
sed -e '/aString12 \(theString34\) otherString56/!b' \
-e 's//\1/' \
-e 's/[0-9]\{2\}$//'
最初の置換(s//\1/
)の空の正規表現は、最近一致したパターン、つまり前の式のパターンを再利用します。