我需要使用 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
选项进行就地编辑
编辑:
感谢@Costas 指出\n?\s*
可以简化为\s*