1

置換コマンドに問題があります。

入力ファイル私はこれを持っています

{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}

シングルクォートに置き換えたい

'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'

以下のコマンドを使用して

find input.txt -exec sed 's/{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}/'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'/g' {} \;

このようなエラーが発生しています

bash: syntax error near unexpected token `('
4

4 に答える 4

1

まず、一重引用符で区切られた引数にリテラルの一重引用符を簡単に挿入することはできません。をまたは
に置き換える必要があります。 この問題を推測するためのヒントとして、ここでは、苦情はシェルから発生します。これは、コマンドラインでさえ不正な形式であることを意味します。''"'"''\''

次に、ドルと括弧はsed正規表現の特殊文字であることに注意してください。あなたはおそらくそれらを脱出する必要があります。man sed詳細については、こちらをお読みください。

第三に、うまくいくかどうかわかりませんfind input.txt。私はあなたが意味したと思いますfind . -type f -name input.txtか?

于 2010-10-13T13:39:46.460 に答える
0

これ'は、置換文字列の裸が実際にsedコマンドを終了しているためです。つまり、シェルが行を処理しようとしているためです。これは、Benoitの編集によって質問の構文が正しく色付けされたときに、実際にすぐに明らかになりました。'行の2番目(置換テキストの最初の文字)が、文字列の終了により赤から黒に色が変わったことがわかります。

さらに、正規表現で文字クラスを示すsedため、裸の使用は好きではありません。[]

次の方法で両方の問題を修正できます。

pax> find input.txt -exec sed 's/{a\[$1\]=a\[$1\]FS$2}END{for(i in a) print i,a\[i\]}/\x27{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}\x27/g' {} \;

出力:

'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'

したがって、基本的に、検索文字列の角かっこをエスケープして、リテラルとして扱われ、。\x27の代わりに置換文字列で使用されるようにします'

于 2010-10-13T13:37:18.823 に答える
0

なぜこれをしなければならないのか、おかしいと思います。awk コードが表示されるので、最初に正しいコードを記述する必要があります。input.txtファイルを作成したときに、ファイル内の単一引用符を意図的に省略したとは言わないでください。編集しているファイルは 1 つだけです。検索を使用する必要はありません。(場所がわからない場合を除きます)。

于 2010-10-13T14:22:32.677 に答える
-1

最後に、これを行う簡単な方法を見つけました。

cat input.txt sed "s/{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}/'{a[$1]=a[$1]FS $2}END{for(i in a) print i,a[i]}'/g"

私が役立つことを願っています

于 2011-06-24T05:34:03.847 に答える