예를 들어 xml 태그가 있습니다 <bestAddressLine4></bestAddressLine4>
.<bestAddressLine4 />
아래 명령을 사용하고 있지만 작동하지 않습니다.
sed -i 's/<bestAddressLine4><\/bestAddressLine4>/<bestAddressLine4\/>/g' file.txt
하지만 작동하지 않습니다.
올바른 명령을 제안해주세요.
당신의 도움을 주셔서 감사합니다.
답변1
@bxm이 올바른 방향으로 가고 있다고 생각합니다.
sed
구현이 비표준 확장을 지원하는 경우 이 명령은 -i
사용자의 로케일 문자 인코딩에 따라 인코딩된 입력에서 예상대로 작동해야 합니다(출력 참조 locale charmap
).
이러한 문자는 모두 이식 가능한 문자 집합에 속하므로 줄의 나머지 부분에도 이식 가능한 문자 집합의 문자만 포함되어 있는 한 시스템의 모든 로케일에서도 작동합니다.
그러나 한 가지 가능성은 파일이 BOM, UTF-16LE, UTF-16BE, UTF-32/UCS-4를 사용하여 UTF-16으로 인코딩되어 POSIX API와 호환되지 않고 어떤 로케일 문자 맵에서도 사용할 수 없다는 것입니다. ) 바이트 0의 문자를 포함하는 인코딩이 많기 때문입니다.
이를 처리하려면 해당 형식의 텍스트를 디코딩할 수 있는 도구나 언어를 사용하거나 시스템에서 지원하는 중간 인코딩(일반적으로 Unix 계열 시스템에서 가장 일반적인 유니코드 인코딩인 UTF-8)으로 변환해야 합니다. .
file file.txt
어떤 인코딩으로 작성되었는지 알려줘야 합니다.
UTF-16(대부분)인 경우 다음을 수행할 수 있습니다.
< file.txt iconv -f UTF-16 |
sed 's|<bestAddressLine4></bestAddressLine4>|<bestAddressLine4/>|g' |
iconv -t UTF-16 > new-file.txt
또는 다음을 사용할 수 있습니다 ( 일부 구현이 perl
차용 되었습니다).-i
sed
perl -Mopen='encoding(UTF-16)' -i -pe '
s{<bestAddressLine4></bestAddressLine4>}{<bestAddressLine4/>}g' file.txt