sed - 앞의 문자가 특정 문자가 아닌 경우 문자열의 문자를 대체합니다.

sed - 앞의 문자가 특정 문자가 아닌 경우 문자열의 문자를 대체합니다.

큰따옴표 앞에 백슬래시가 있는 큰따옴표(또는 문자열과 같은 것을 포함하는 텍스트 줄)가 포함된 문자열이 있는 경우 sed가 백슬래시가 앞에 오지 않은 큰따옴표를 다른 문자로 바꾸는 가장 좋은 방법은 무엇입니까? 아니면 문자열?

      original string    'Abc \"NN""xyz\"ddd"ee "ff" \"QQ\"'

      replace non backslash double-quote with percent symbol

           new string    'Abc \"NN%%xyz\"ddd%ee %ff% \"QQ\"'

지금까지 내가 찾은 유일한 방법은 먼저 "백슬래시 큰따옴표" 조합을 텍스트에서 찾을 수 없고 대체 문자나 문자열과 다른 고유한 문자나 문자열로 바꾸는 것입니다. double 따옴표를 원하는 것으로 바꾸고(예: 백슬래시 큰따옴표 또는 이 경우 명확성을 위해 백분율 기호) 남은 문자열만 다시 원래 백슬래시 큰따옴표로 변경합니다. 따라서 이 방법을 사용하려면 sed를 3번 호출해야 합니다.

그렇다면 sed를 사용하여 이 작업을 수행하는 더 쉬운 방법이 있습니까?

답변1

GNU 사용sed

$ sed -E ':a;s/(\\")([^\]*)"/\1\2%/;ta' input_file
'Abc \"NN%%xyz\"ddd%ee %ff% \"QQ\"'

답변2

sed -e 's/[\]"/%/g' -e 'y/"%/%"/' -e 's/"/\\"/g'

이는 먼저 각 항목 \"을 대체합니다 %. 그러면 모든 것이 바뀌고 그 반대 %도 마찬가지입니다 ". 마지막으로 나머지 큰따옴표는 모두 이스케이프됩니다.

문자열 %에 시작할 내용이 없으면 이스케이프 처리되지 않은 큰따옴표가 모두 대체됩니다 %.

또는 @처음부터 데이터에 있어서는 안 되는 추가 문자를 사용하는 경우:

sed -e 's/[\]"/@/g' -e 'y/"/%/' -e 's/@/\\"/g'

이 변형은 무슨 일이 일어나고 있는지 더 명확하게 보여 주며 귀하의 질문에서 제안한 것입니다( sed한 번의 호출만 사용하더라도). 이스케이프 처리되지 않은 큰 따옴표를 바꾸는 동안 이스케이프 처리된 큰 따옴표가 들어올 때 일시적으로 "숨깁니다" %. 완료되면 복원합니다.

답변3

스트림 편집기 -E|-r의 확장된 정규식 기능을 활용하십시오() GNU sed.

문제는 백슬래시가 짝수(0은 짝수임) 앞에 백슬래시가 아닌 문자나 줄의 시작이 뒤따르는 따옴표 문자를 감지하는 것입니다.

견적은 퍼센트 기호로 변환됩니다.

큰따옴표 버전입니다.

sed -E -f - <<\eof file
  :a;s/((^|[^\])([\][\])*)"/\1%/g;ta
eof

작은따옴표 버전.

sed -E -f - <<\eof file
  :a;s/((^|[^\])([\][\])*)'/\1%/g;ta
eof

관련 정보