파일의 따옴표를 sed로 바꾸는 방법은 무엇입니까?

파일의 따옴표를 sed로 바꾸는 방법은 무엇입니까?

여러 줄의 XML이 포함된 파일이 있습니다. 파일의 일부를 교체하고 싶습니다. 파일의 일부 부분에 "바꾸고 싶은 따옴표( )가 포함되어 있습니다. 나는 노력해왔다탈출하다quote \이지만 내 파일 결과에 따르면 이것이 작동하지 않는 것 같습니다.

다음은 내 sed 명령 중 하나의 예입니다.

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

이것이 sed 명령에서 따옴표를 피하는 방법입니까, 아니면 제가 뭔가 잘못하고 있는 것입니까?

답변1

두 가지 팁:

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

    • 'foo'        선두foo
    • \'             탈출하다'
    • 'bar'        선두bar

    생산하다 foo'bar.

  2. /(선택 사항) 반드시 sed에서 사용할 필요는 없습니다 . 동일한 sed 표현식에서 /and 를 사용하면 \읽기가 어렵다는 것을 알았습니다.

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

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

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

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

첫 번째 팁에 따르면 쉘은 sed의 두 번째 인수(뒤에 오는 문자열 -e)를 로 줄여 s|["']||g해당 문자열을 sed에 전달합니다. 두 번째 팁에 따르면 sed는 이를 s/['"]//g.

'or와 일치하는 모든 문자를 제거합니다 "   (즉, null로 대체).

원하는 것을 달성하려면 이보다 더 복잡한 것이 필요할 수도 있지만 시작에 불과합니다.

답변2

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

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

관련 정보