나는 연결되는 두 문자열 리터럴의 모든 인스턴스를 찾기 위해 (또는 다른 Unix 유틸리티) 명령을 찾고 있습니다. sed
그러면 명령은 해당 연결을 두 문자열 리터럴의 해당 조합으로 대체합니다.
특히 저는 Go 및 Java 소스 코드 편집을 자동화하려고 합니다.
\"
문자열 리터럴이나 +
문자열 리터럴 내에 나타나는 경우 명령이 중단되어서는 안 됩니다.
이 명령은 문자 앞뒤의 공백 문자 수(또는 공백 문자 부족)를 처리해야 합니다 +
.
몇 가지 예:
"foo" + "bar"
=>"foobar"
"\"foo" + "bar"
=>"\"foobar"
"foo"+"bar"
=>"foobar"
"something else with " + "other words"
=>"something else with other words"
a + "bar" + "baz" + c
=>a + "barbaz" + c
"" + "bar" + "" + "foo"+ x
=>"barfoo"+ x
(대답이 Unix 도구가 아닌 프로그래밍 언어를 사용하더라도 상관 없습니다.)
답변1
다음과 같이 보일 수 있습니다:
sed -E '
:1
s/^(([^"]+|"(\\.|[^"\\])*")*"(\\.|[^"\\])*)"[[:blank:]]*\+[[:blank:]]*"/\1/
t1'
존재하다:
"foo" + "bar"
"\"foo" + "bar"
"foo"+"bar"
"something else with " + "other words"
"foo\"+" + "+" + "bar"
"1"+"\"+"+"2"
그것은 다음을 제공합니다:
"foobar"
"\"foobar"
"foobar"
"something else with other words"
"foo\"++bar"
"1\"+2"
이제 Java 코드를 처리해야 한다면 그것만으로는 충분하지 않습니다. "
주석에 삽입하거나 '"'
몇 줄에 다음과 같은 내용을 추가하는 방법을 생각해야 합니다.
/*
"-quoted strings ("A" + "B") have been converted to "AB"
*/
'"' // blah " + ""
c = '"'; s = "+"; c2 = '"';
f("foo" +
"bar")
이러한 문제를 해결하려면 주석을 추가하고 '...'
일치 항목에 태그를 지정하고 입력을 여러 줄로 처리해야 합니다. 가능하지만 더 복잡합니다.
답변2
플러스에 대한 한 가지 접근 방식 POSIX sed
은 쉘 변수를 활용하여 정규식 조합을 다루기 쉽게 만드는 것입니다.
#> one quoted chunk
qF='"
\(
[^\"]* \( [\]. [^\"]* \)*
\)
"'
#> concatenate operator
plus='
[[:blank:]]* [+] [[:blank:]]*
'
#> string add operation
add=" $qF $plus $qF "
#> de-whitespace regex
re=${add//[$IFS]/}
##>
sed -e '
:loop
s/'"$re"'/"\1\3"/
t loop
' file
산출:-
"foobar"
"\"foobar"
"foobar"
"something else with other words"
a + "barbaz" + c
"barfoo"+ x