1

1つの正規表現ksh行で、次のことを行う必要があります。

  1. 特定の文字列の出現に続いて、特定の値(この場合はコンマ)が最後に出現するまでの任意の数の文字を探します。
  2. 出力に一致するものをコピーしてから
  3. コピーされたテキストの後、特定の値(この場合はコンマ)が最後に出現する前に新しい値を挿入します

したがって、入力文字列が次のようになっている場合:

SEARCH_STRING anything_else(foo,bar),

私が出力したいのはこれです:

SEARCH_STRING anything_else(foo,bar) INSERTED_VALUE,

これまでのところ、私のsed式は次のようになっています(これは、最後までではなく、コンマの最初の出現までのすべてに一致してコピーするだけです):

sed -e 's/SEARCH_STRING [^,]\+/& INSERTED_VALUE/' 

...これは次の結果になります:

SEARCH_STRING anything_else(foo INSERTED_VALUE,bar)

...これは正しくありません。ネガティブな先読みのようなものを使用する必要があることはわかっていますが、構文を正しく理解することはできません。何かアドバイスをいただければ幸いです。また、カンマが見つからない場合でも、行末で同じ置換を行う必要があります(ただし、別の質問と表現が必要になる場合があります)。アドバイスをよろしくお願いします。

4

2 に答える 2

1

$行の終わりに一致する特殊文字を使用し、.その前の最後の文字に一致する特殊文字を使用します。

sed 's/\(SEARCH_STRING .*\)\(.\)$/\1INSERTED_VALUE\2/'

これが常に置き換えたい文字になることがわかっている場合は、一致式の最後のドットをコンマに置き換えることができます。その最後の文字が異なる場合、ドットを使用するとそのような文字と一致します。ただし、1つの欠点は、空白にも一致することです。したがって、行のコンマの後に余分なスペースがいくつかある場合、この式はコンマではなくスペースを削除します。

最後の非空白文字を置き換えるには、代わりに次の式を使用します。

sed 's/\(SEARCH_STRING .*\)\(\S\s*\)$/\1INSERTED_VALUE\2/'
于 2013-03-06T21:55:43.947 に答える
1

最も簡単なのは先読みを使用することSEARCH_STRING .*(?=,)ですが、sedはこれをサポートしていません。代わりに、次のようなことを行うことができます。

sed -e 's/\(SEARCH_STRING .*\)\(,.*\)/\1 INSERTED_VALUE\2/'

基本的に、最後のコンマの前後にあるものを後方参照し、それをINSERTED_VALUE途中でつなぎ合わせます。

于 2013-03-06T22:01:02.643 に答える