$cat file0
"basic/strong/bold"
" /""?basic""/strong/bold"
"^/))basic"
basic
引用符で囲まれていない基本のみを変更するような unix sed コマンドが必要です。[基本をリングに変更]
期待される出力:
$cat file0
"basic/strong/bold"
" /""?basic""/strong/bold"
"^/))basic"
ring
sed ソリューションではありませんが、引用符で囲まれていない単語を置き換えます
文字列にエスケープされた引用符がないと仮定すると、つまり"This is a trap \" hehe"
awk でこの問題を解決できる可能性があります
awk -F\" 'BEGIN {OFS=FS}
{
for(i=1; i<=NF; i++){
if(i%2)
gsub(/basic/,"ring",$i)
}
print
}' inputFile
基本的に、引用符で囲まれていない単語は奇数フィールドにあり、これらのフィールドでは「基本」という単語は「リング」に置き換えられます。
これはワンライナーで書くこともできますが、わかりやすくするために複数行に分けて書いています。
$> sed -r 's/^([^\"]*)(basic)([^\"]*)$/\1ring\3/' file0
"basic/strong/bold"
" /""?basic""/strong/bold"
"^/))basic"
ring
ファイルをその場で編集したい場合は、--in-place
オプションを使用してください。
引用符のエスケープを禁止する場合、含まれてbasic
いないものの"
前に偶数の"
. したがって、これでうまくいくはずです:
sed -r 's/^([^"]*("[^"]*){2}*)basic/\1ring/' file
また、ДМИТРИЙ МАЛИКОВ が述べたように、--in-place
オプションを追加すると、新しい内容を返す代わりに、ファイルがすぐに編集されます。
これはどのように作動しますか?
正規表現を各行の先頭に で固定し"
ます。次に、任意の数の非"
文字を許可します ( を使用[^"]*
)。次に、1 つの任意の数の非文字"[^"]*
で構成される新しいサブパターンを開始します。それを偶数回繰り返します( を使用)。そして、一致します。それも置き換える前に、ライン内のすべてのものを一致させたからです。そのため、この部分が別の括弧のペアで囲まれているため、行がキャプチャされ、その後に続く に置き換えて書き戻されます。"
"
{2}*
basic
basic
\1
ring
1 つの注意点:basic
正規表現の一致は重複できないため、1 行に複数の出現がある場合、これは二重引用符で囲まれていない最後のもののみを置き換えます。解決策は後読みになりますが、これは可変長の後読みになるため、.NET 正規表現エンジンでのみサポートされます。したがって、実際の入力がそうである場合は、すべてのオカレンスが置き換えられるまで、コマンドを複数回実行します。
これはうまくいくかもしれません(GNU sed):
sed -r 's/^/\n/;ta;:a;s/\n$//;t;s/\n("[^"]*")/\1\n/;ta;s/\nbasic/ring\n/;ta;s/\n([^"]*)/\1\n/;ta' file
basic が行頭にある場合:
sed -e 's/^basic/ring/' file0