2017-08-31 17 views
1

フィールド名に[0-9] [0-9]:属性を追加するためのユースケースがありますが、一部のフィールドはすでに属性::, を持っていますので、attribtueを追加するだけです:: [0-9] [0-9]名_する:属性が続いていないことを::否定の先読み正規表現によるSed置換

私はこれを試してみました:

私は正規表現があるべきオンライン正規表現のデバッガでテスト
sed -n 's/name_[0-9][0-9]:(?!attribute::)/&attribute::/p' out 

私が必要とするものですが、実際にはname_01を指定すると一致しません:abc

+0

'sed'はPCREを使用しないため、先読みがありません。 – Barmar

+0

@Barmarそれでは、とにかくこれを達成するには? – michael

+0

GNU 'sed'を使うと、PCREで再コンパイルできると思います。それはGoogleです。 – Barmar

答えて

1

"オンライン正規表現デバッガ"は、テストする正確な正規表現方言をしばしば教えてくれません。彼らがあなたに言うなら、sedがサポートする方言を知る必要があります。

私が知っているsedの中ではサポートされていないPerl正規表現機能を使用しようとしていますが、もちろんPerlで非常によくサポートされています。

perl -ne 's/name_[0-9][0-9]:(?!attribute::)/$&attribute::/ and print' out 
+0

ええ、パーは私の問題を完璧に解決します – michael

1
$ cat file1 
name_12: 
name_34:attribute:: 
name_56: 

$ sed '/:attribute::/n; s/name_[0-9][0-9]:/&attribute::/g' file1 
name_12:attribute:: 
name_34:attribute:: 
name_56:attribute:: 

n:次の行を読んでください。

+0

これは、行内のどこでも ':attribute ::'を探すという点でそれほど正確ではありません。 OPの問題は、この種のコーナーケースになりやすいようには見えないが、おそらくそれはまだ綴られているはずである。 – tripleee

関連する問題