0
$cat file0
"basic/strong/bold"
" /""?basic""/strong/bold"
"^/))basic"
basic 

引用符で囲まれていない基本のみを変更するような unix sed コマンドが必要です。[基本をリングに変更]

期待される出力:

$cat file0
"basic/strong/bold"
" /""?basic""/strong/bold"
"^/))basic"
ring
4

5 に答える 5

0

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

基本的に、引用符で囲まれていない単語は奇数フィールドにあり、これらのフィールドでは「基本」という単語は「リング」に置き換えられます。

これはワンライナーで書くこともできますが、わかりやすくするために複数行に分けて書いています。

于 2012-10-26T03:54:14.873 に答える
0
$> sed -r 's/^([^\"]*)(basic)([^\"]*)$/\1ring\3/' file0
"basic/strong/bold"
" /""?basic""/strong/bold"
"^/))basic"
ring

ファイルをその場で編集したい場合は、--in-placeオプションを使用してください。

于 2012-10-22T13:26:05.963 に答える
0

引用符のエスケープを禁止する場合、含まれてbasicいないものの"前に偶数の". したがって、これでうまくいくはずです:

sed -r 's/^([^"]*("[^"]*){2}*)basic/\1ring/' file

また、ДМИТРИЙ МАЛИКОВ が述べたように、--in-placeオプションを追加すると、新しい内容を返す代わりに、ファイルがすぐに編集されます。

これはどのように作動しますか?

正規表現を各行の先頭に で固定し"ます。次に、任意の数の非"文字を許可します ( を使用[^"]*)。次に、1 つの任意の数の非文字"[^"]* で構成される新しいサブパターンを開始します。それを偶数回繰り返します( を使用)。そして、一致します。それも置き換える前に、ライン内のすべてのものを一致させたからです。そのため、この部分が別の括弧のペアで囲まれているため、行がキャプチャされ、その後に続く に置き換えて書き戻されます。""{2}*basicbasic\1ring

1 つの注意点:basic正規表現の一致は重複できないため、1 行に複数の出現がある場合、これは二重引用符で囲まれていない最後のもののみを置き換えます。解決策は後読みになりますが、これは可変長の後読みになるため、.NET 正規表現エンジンでのみサポートされます。したがって、実際の入力がそうである場合は、すべてのオカレンスが置き換えられるまで、コマンドを複数回実行します。

于 2012-10-22T17:19:56.620 に答える
0

これはうまくいくかもしれません(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
于 2012-10-22T19:07:18.750 に答える
-3

basic が行頭にある場合:

sed -e 's/^basic/ring/' file0
于 2012-10-22T13:26:15.250 に答える