다음을 수행하려면 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*