파일의 인용 부호를 sed로 바꾸는 방법은 무엇입니까?


10

여러 줄의 xml이 들어있는 파일이 있습니다. 파일의 특정 부분을 바꾸고 싶습니다. 파일의 일부 부분에는 따옴표 ( ")가 포함되어 있습니다 . 로 따옴표 를 이스케이프 하려고 시도 \했지만 파일 결과에 따라 이것이 작동하지 않는다고 생각합니다.

내 sed 명령 중 하나의 예는 다음과 같습니다.

sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp

이것이 sed 명령에서 따옴표를 이스케이프 처리하는 방법입니까, 아니면 내가 잘못하고 있습니까?


2
당신의 명령을 교체 바로 보이는 "text"'text'. 물론 아무것도하지 않습니다 "othertext". 몇 개의 입력 라인, 해당하는 원하지 않는 출력을 표시하고 대신 원하는 출력을 설명하십시오.
Gilles 'SO- 악마 그만'

그래서 \"나오지 명령에 인용 부호를 이스케이프의 올바른 방법은 무엇입니까?
jbranchaud

4
sed에 적합하지 않음 : sed는 escaping을 필요로하거나 지원하지 않습니다 ". 그러나 쉘 명령은 큰 따옴표로 묶인 문자열을 사용하며 \"정확합니다. sed프로그램은보고 s/"text"/'text'/ig에 대한 인수로 -e.
Gilles 'SO- 악마 그만해'19:

@Gilles 공백은 어떻습니까? sed는 공백을 이해하고 존중합니까? 내 명령이 포함 된 경우 예를 들어, s/\"text\" /'text'/ig겠습니까을 만 찾아 "text" 그 이후의 공간?
jbranchaud 2015 년

3
공백은 정확히 일치해야합니다. 이 대화를 계속 진행하기보다는 샘플 입력과 해당 출력을 게시하는 것이 좋습니다 (견적을 변경해야하는 이유를 설명 할 수도 있음). sed작업에 적합한 도구 인지 는 확실하지 않으며 XML 파서를 원할 수도 있습니다.
Gilles 'SO- 악의를 멈춰라'

답변:


11

두 가지 팁 :

  1. 작은 따옴표로 인용 된 문자열 내에서 작은 따옴표를 이스케이프 할 수 없습니다. 따라서 견적을 닫고 이스케이프 된 견적을 추가 한 다음 견적을 다시 열어야합니다. 즉 : 'foo'\''bar', 다음 과 같이 분류됩니다.

    • 'foo'        인용 foo
    • \'             탈출 '
    • 'bar'        인용 bar

    항복 foo'bar.

  2. (선택 사항) 반드시 /sed 에서 사용할 필요는 없습니다 . 내가 사용하는 것을 발견 /\같은 나오지도 발현하는 읽기가 어렵습니다.

예를 들어,이 파일에서 따옴표를 제거하려면 다음을 수행하십시오.

$ cat /tmp/f
aaa"bbb"'ccc'aaa

위의 두 가지 팁을 감안할 때 큰 따옴표와 작은 따옴표를 모두 제거하는 데 사용할 수있는 명령은 다음과 같습니다.

$ sed -e 's|["'\'']||g'  /tmp/f

첫 번째 팁을 기반으로 쉘은 sed의 두 번째 인수 (즉,. 다음의 문자열 -e)를 줄이고 sed로 s|["']||g해당 문자열을 전달합니다. 내 두 번째 팁을 기반으로 sed는이 내용을와 동일하게 취급합니다 s/['"]//g. 그 뜻은

'또는 일치하는 모든 문자를 제거합니다 "   (예 : 아무것도 아닌 문자로 교체)

당신이 원하는 것을하기 위해 이것보다 더 복잡한 것이 필요할지 모르지만 그것은 시작입니다.


1
두 번째 팁에 더 나은 요점을 두려면 : s 및 y 명령을 사용할 때 / 대신 다른 문자를 사용할 수 있습니다. 다른 sed 명령과 함께 regexp를 사용하는 경우 첫 번째 분리 문자 (/의 대안을 사용하는 경우)를 이스케이프해야합니다. 정규식 내에서 일치시키려는 경우 선호하는 구분 기호도 이스케이프 처리해야합니다.
Eli Heady

지저분하지 않고 작은 따옴표와 큰 따옴표를 혼합하는 것은 어렵습니다. 작은 따옴표 를 인용 하면 큰 따옴표로 묶지 않고 작은 따옴표 를 인용 하면 읽기가 더 쉽습니다 . 따라서 'foo'\''bar'우리는 대신 에을 사용할 수 있습니다 'foo'"'"'bar'.
Scott

1

유닉스 유틸리티의 Windows 포트가 있으므로 명령이 약간 다르게 보이지만 쉼표와 따옴표가있는 csv 파일이 있습니다. 이 스레드를 가이드로 사용하여이 명령을 통해 따옴표를 제거 할 수있었습니다.

c:\Temp> cat report.csv | sed "s/\,/\ /g" | sed "s/[""]//g"

감사! 이것에 붙어 있었다!
sendbits
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.