1

私はsed13を使用して置き換えようとしています:21

echo "for i in {1..5}; do commands for FILE13 > output_${i}; done" | sed 's/13/21/g'

そして、私の出力は次のようになります。

for i in {1..5}; do commands for FILE21 > output_2; done

13に置き換えられました21が、さらに${i}に置き換えられました2

なぜこれが起こるのですか?そして、mu中括弧のコンテンツをsedで置き換えるのをやめるにはどうすればよいですか?

編集

コマンドが次のようになっている場合はどうなりますか?

echo 'for i in {1..5}; awk'{( do commands)}' FILE13  > output_${i}; done' | sed 's/13/21/g'

そして、私が得ているので、二重引用符を一重引用符に置き換えることはできませんbash: syntax error near unexpected token('`

\中括弧をエスケープするために使用する唯一の解決策はありますか?

4

3 に答える 3

2

中括弧の代わりにsedではなく、シェルです。エコーされた文字列の二重引用符を一重引用符に変更します。

比較:

$ echo "for i in {1..5}; do commands for FILE13 > output_${i}; done"
for i in {1..5}; do commands for FILE13 > output_; done

$ echo 'for i in {1..5}; do commands for FILE13 > output_${i}; done'
for i in {1..5}; do commands for FILE13 > output_${i}; done

エコーしている文字列に一重引用符自体が含まれている場合は、二重引用符を使用してエスケープする$か、引用符を直接処理します。

$ echo "for i in {1..5}; awk'{( do commands)}' FILE13  > output_\${i}; done"
for i in {1..5}; awk'{( do commands)}' FILE13  > output_${i}; done

$ echo 'for i in {1..5}; awk'"'"'{( do commands)}'"'"' FILE13  > output_${i}; done'
for i in {1..5}; awk'{( do commands)}' FILE13  > output_${i}; done
于 2013-02-11T15:30:21.777 に答える
1

echoの引数はリテラル文字列ですか?それで:

echo "for i in {1..5}; do commands for FILE13 > output_\${i}; done" | sed 's/13/21/g'
于 2013-02-11T15:29:35.777 に答える
1

一重引用符で囲まれた文字列に一重引用符を埋め込むことはできません。試す:

echo 'for i in {1..5}; awk'"'"'{( do commands)}'"'"' FILE13  > output_${i}; done'
于 2013-02-11T17:57:53.533 に答える