文字列を置き換える例:

文字列を置き換える例:

以下を行うには 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*

関連情報