Sed:次の行に進むパターンを見つけて置き換える

Sed:次の行に進むパターンを見つけて置き換える

パターンを見つけて置き換えたいのですが、パターンが次の行に進むため、これを処理する方法を見つける必要があります。

次のようなもの:

....tr("Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?"));

次のようになる

...."Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?");

(...前のコードです)

これまでのところ、私のコードは次のようになりました(単一行では機能しますが、ラップされたテキスト/コードでは機能しません)。

sed -i 's/tr(\([^)]*\))/\1/I' $file_t

どうすればいいですか?

答え1

tr(コマンドが常に2行にわたって分散している場合は、次のことを試してください。

$ sed  '/tr(/N; s/tr(\([^)]*\))/\1/I' "$file_t"
...."Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?");

ここでの唯一の変更は、一致/tr(/Nする行についてtr(次の行を読み取り、それをパターンスペース(N)に追加することです。

ファイルを所定の位置に変更するには、次のようにします-i

sed  -i.bak '/tr(/N; s/tr(\([^)]*\))/\1/I' "$file_t"

より強力なバージョン

tr(...)コマンドが1行、2行、または2行以上表示される場合は、ロジックを少し変更する必要があります。

sed  '/tr(/{ :a; s/tr(\([^)]*\))/\1/I; t; N; ba}' filename

それからtr(。そのような行に対しては、{...}中括弧で囲まれたコマンドが実行されます。そのようなラインの場合、まずそのラインでのみ交換が試みられます。置換が発生すると、このtコマンドはsedにこの行が終了したことを知らせます。これが発生しない場合はendがないことを意味し、)次の行は()で読み取られ、sedはlabel()Nに再分岐して交換を再試行します。を見つけるのに十分な行を読むまでこの操作を繰り返します。aba)

たとえば、次はtr(...)1行、2行、3行のファイルです。

$ cat filename
tr("abc");
....tr("Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?"));
tr("one
two
three");

出力は次のとおりです。

$ sed  '/tr(/{ :a; s/tr(\([^)]*\))/\1/I; t; N; ba}' filename
"abc";
...."Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?");
"one
two
three";

tr(...)間の違いPtr(...)

orのみを置き換えてtr置き換えないようにするには、単語の境界で始まることを確認する必要があります。 GNU sed(Linux)の場合、単語の境界は次のように表されます。PtrStrtr\b

sed  '/\btr(/{ :a; s/\btr(\([^)]*\))/\1/I; t; N; ba}' filename

BSD(OSX) sed を使用して、次のような動作可能:

sed  '/[[:<:]]tr(/{ :a; s/[[:<:]]tr(\([^)]*\))/\1/I; t; N; ba}' filename

関連情報