以下を行うには sed を使用する必要があります。
文字列を置き換える例:
tr("Text");
到着
"text";
tr("Textfsafasfsfas safasdfsafas");
到着
"Textfsafasfsfas safasdfsafas";
foo(tr("text"));
到着
foo("text");
次の文字列を置き換えないでください。
tr("text").arg(text);
tr("I am some text") .arg(i do stuff);
tr("I am some text") .arg(i do stuff) .arg(I also do stuff);
行1からnまで処理する必要があります。
.arg
私の現在のコードは複数行のエッジケースを扱っていません。良いアイデアがありますか?
現在のsedコード:
sed -i '/\btr(/{ :a; s/\btr(\([^)]*\))\([^.]\)/\1\2/I; t; N; ba}' $file_t
編集する:
errors << tr("Error: Encountered an invalid token at line: %1, column: %2.") .arg(m_reader.lineNumber()) .arg(m_reader.columnNumber());
極端なケースであり、まだ問題です。
答え1
$ cat ip.txt
tr("Text");
tr("Textfsafasfsfas
safasdfsafas");
foo(tr("text"));
tr("text").arg(text);
tr("I am some text")
.arg(i do stuff);
tr("I am some text")
.arg(i do stuff)
.arg(I also do stuff);
tr("I am some text")
.arg(i do stuff);
ファイルが十分に小さい場合は、すべての行を単一の文字列として処理してメモリに保存できます。
$ perl -0777 -pe 's/\btr\(([^)]+)\)(?!\s*.arg)/$1/g' ip.txt
"Text";
"Textfsafasfsfas
safasdfsafas";
foo("text");
tr("text").arg(text);
tr("I am some text")
.arg(i do stuff);
tr("I am some text")
.arg(i do stuff)
.arg(I also do stuff);
tr("I am some text")
.arg(i do stuff);
出力が正常な場合は、内部編集のオプションを-i
追加してください。-i.bak
編集する:
\n?\s*
これは次のように単純化できることを指摘した@Costasに感謝します。\s*