2016-05-20 7 views
0

私はこのようなファイルがあります:sedの中で何かを置き換える順序が重要なのはなぜですか?

(paren) 
[sharp] 

をそして私はこのように交換してみてください。

sed "s/(/[/g" some_file.txt 

を、それだけで正常に動作します:

[paren) 
[sharp] 

は、その後、私は次のように置き換えようこれは:

sed "s/[/(/g" some_file.txt 

そして、それは私にエラーを与える:

sed: 1: "s/[/(/g": unbalanced brackets ([]) 

私はこれが出てエラーしまう理由として任意の証拠を見つけることができません。 [(の順番はどうしてですか?

ありがとうございました。

+0

'場合は、' sed'をGoogleとその上の任意のチュートリアルをお読みください。 –

答えて

4

[は、bracket expressionの一部です。これには、対応する部分(])が必要です。

はリテラル [シンボルに一致するように [エスケープ

echo "[sharp]" | sed 's/\[/(/g' 

はリテラル文字列で正規表現を交換しているので、それが重要な理由があるIDEONE demo

+1

*なぜ '['と '(' matter?*)の順序は実際には順序ではなく、置換sedコマンドが何をしているのかということですが、Andrewはそれについて説明しますが、 ''( '、' ''として扱われますが、 ''は大括弧式の一部であるため、存在する必要があります)パターンを閉じるための ']'を置き換え、*置換パターン*(後方参照を含むことができる正規表現パターンを含まない*文字列*)、*フラグ*(または*修飾子*)(ここでは、「g」 - すべての試合のグローバル置換)。 –

2

を参照してください。 したがって、ブラケットは2番目のスラッシュの後に使用すると文字として表示されます。最初のスラッシュと2番目のスラッシュの間で使用される場合、無効な正規表現の一部として表示されます。この式で

s/(/[/g

それはないです:

s/[/(/g

1

SEDとの交換の最初のパラメータしたがって、この表現に '[' 文字として解釈される

正規表現のパターンでなければなりません:
​​

開き角括弧は文字クラスの先頭であるため、正規表現パターンでは特別な意味を持ちます。たとえば、[a-z]です。そのため、置換の順序とは関係のないこのエラーメッセージが表示されます。unbalanced brackets ([])(開いている文字クラスを閉じる必要があります。)

リテラルの開口部の角括弧を得るために、あなたはそれをエスケープする必要があります:\[

sed 's/\[/(/' file 

あなたの目標は、他の人の中に文字を変換する場合は、より簡単な方法は、翻訳を使用して、そこにある、そのtr

echo "$a" | tr '[]()' '()[]' 
を使用して

a='(paren) 
[sharp]' 

:円形交換の問題を回避します

またはsedと:男性sed`が十分な情報を提供していません

echo "$a" | sed 'y/[]()/()[]/' 
関連する問題