문자열 바꾸기 예:

문자열 바꾸기 예:

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

관련 정보