パターンを見つけて置き換えたいのですが、パターンが次の行に進むため、これを処理する方法を見つける必要があります。
次のようなもの:
....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
に再分岐して交換を再試行します。を見つけるのに十分な行を読むまでこの操作を繰り返します。a
ba
)
たとえば、次は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)の場合、単語の境界は次のように表されます。Ptr
Str
tr
\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