2017-12-14 7 views
-1

私はこのようになりますファイルtry.txtを持っている:(bashの)

(SOME_PRINT): [a] content 
(SOME_PRINT): [a] [b] content 

私は、ファイル内の行の先頭でこのパターンを持っている場合: (SOME_PRINT): [<word>]<word>は文字と数字の組み合わせのみです)、(OTHER_PRINT):に置き換えています。上記のファイルの場合
、私はその実行ファイルがなるようになりますというコマンドを見つけるしたいと思います:

(OTHER_PRINT): content 
(OTHER_PRINT): [b] content  

私はsed -r -i 's/^\(SOME_PRINT\)\: \[.*\] /\(OTHER_PRINT\)\: /' try.txtを実行しようと、この出力を得た:

(OTHER_PRINT): content 
(OTHER_PRINT): content    

をすることができます[b]がなぜ消えたのか説明してください。

+0

sedは非貪欲型をサポートしていませんが、重複した質問の回答に指定されているように、この場合回避策を使用できます。また、 '()'をエスケープしなくても'-r'オプション – Sundeep

答えて

1

ただ、このようなあなたの正規表現を変更します。

sed -r -i 's/^\(SOME_PRINT\)\: \[[a-zA-Z0-9]\] /\(OTHER_PRINT\)\: /' try.txt

あなたのエラーは、あなたの正規表現のこの部分は十分に正確ではないということです:\[.*\]

[a] [b]\[.*\]

でキャッチすることができ解決策は、大括弧で囲んだ文字だけを指定することです。英数字のみについて述べたように、これはこのセレクタで行うことができます:[a-ZA-Z0-9]

もう1つの解決策は、文字から閉じる角括弧を除外することです。

私はしばしば正規表現https://regex101.com/を試してみます。それは非常にクールで包括的です。

+0

役に立つリンクをありがとう。 –