パターンが一致したときにテキストを行末に追加する方法は?


8

入力:

line1 with the PATTERN that contains ( ) 
line2 with the PATTERN that contains ( ) 
lineN with the PATTERN that contains ( ) 

出力:

line1 with the PATTERN that contains ( ) ;
line2 with the PATTERN that contains ( ) ;
...
lineN with the PATTERN that contains ( ) ;

私はこれを試しました:

find . -name "test.txt" -print | xargs sed -i "/PATTERN/ s/$)/); /g"

しかし、それはうまくいきませんでした。

回答:


3
perl -ipe 's/$/;/ if /PATTERN/'

;行にが含まれてPATTERNいる場合は、末尾にaが追加されます。


3

$行の末尾にマッチするので、あなたのパターンがあるべき)$代わりの$)あなたの例のように。

また、xargsここでは必要ありません。次の-execフラグを使用する方が安全ですfine

find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' +

+最後にfindのバージョンが機能しない場合は、\;代わりに使用してください(@ glenn-jackmanに感謝):

find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' \;

最後gに、s/something$//イディオムではフラグは必要ありません$。1行に1 つしか出現しないからです。


1
あなたの発見がそれを許すなら、あなたはの-exec ... +代わりにいくつかの効率を得るでしょう-exec ... \;
グレンジャックマン14

2

それPATTERNが実際に( )あり、間に何かが入る可能性が( )あり、それらが必ずしも行末にあるとは限らないと仮定します。

sed -i '/(.*)/ s/$/ ;/' test.txt

1

使用exvi -e/ と同等vim -e)。

1つのファイル:

ex +"g/local/s/$/;/g" -cwq foo.txt

すべてのtest.txtファイルを再帰的に:

ex +"bufdo g/local/s/$/;/g" -cxa **/test.txt

注:シェルがサポートしている場合は、グロビングオプション**)が有効になっていることを確認してくださいshopt -s globstar

注::bufdoコマンドはPOSIXではありません。



0

試してください:

sed --in-place '/PATTERN/s/.*/&;/' /path/to/file.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.