次のファイルがあります。
1,2,subjects,\mat\hs,unix\,\Nato,\N,123,\N
\N を除くすべての \ を # に置き換えて、出力を次のようにしたいと思います。
1,2,subjects,#mat#hs,unix#,#Nato,\N,123,\N
次のsedコマンドを作成しようとしています。
sed -e 's@\\([^N])@#\1/g' filename
ただし、これはexの先頭に\ Nがあるすべての値に対して失敗します。\Nato
上記の例では。
私の要件を満たすsedコマンド(正規表現)を見つけるのに役立つ人はいますか?
ベストアンサー1
私はあまり上手ではありませんsed
。ただし、これはperl
正規表現ツアーを使用して簡単に実行できます。
perl -pe 's/\\(?!N\b)/#/g' your_file_here
これにより、変更されたファイルが標準出力として印刷されます。交換するには、次のようにします。
perl -pi -e 's/\\(?!N\b)/#/g' your_file_here
デフォルトでは、これは従わないバックスラッシュN\b
(単語の境界にある文字N)に置き換えられます#
。
編集する
項目がコンマで区切られていると確信している場合は、次のようにして単語の終わりの大文字と\N
小文字を無視できます(SOLEM\N
提供された例のように)。
perl -pe ' s/\\/#/g; s/(\A|,)\s*#N\s*(\Z|,)/$1\\N$2/g;' your_file_here
バックスラッシュをハッシュトークンに置き換えてから、#N
2つのカンマの間、文字列の先頭とカンマの間、またはカンマと文字列の終わりの間で見つかったものを見つけます。