sed 명령은 두 문자열 리터럴을 연결하는 문제를 수정합니다.

sed 명령은 두 문자열 리터럴을 연결하는 문제를 수정합니다.

나는 연결되는 두 문자열 리터럴의 모든 인스턴스를 찾기 위해 (또는 다른 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

관련 정보