태그 안에 콘텐츠를 가져와야 하는 파일이 있습니다. 예를 들어:
<Model500>
ABC
BCD
CDE
</Model500>
<Model500>
123
234
345
</Model500>
의 내용을 추출하고 싶습니다.
<Model500>
</Model500>
"sed"를 사용하세요
그래서 그것은 다음과 같습니다
ABC
BCD
CDE
123
234
345
나는 사용해 보았습니다.
sed -e 's/<Model>\,/</Model>/p' file.txt
하지만 특수 문자로 인해 문제가 발생했습니다. 어떤 제안이 있으십니까? 감사해요.
답변1
입력이 XML인 경우 XML 관련 도구를 사용하는 것이 가장 좋습니다.
방법 1
sed 정규식에 a를 포함하는 한 가지 방법은 /
백슬래시를 사용하여 이스케이프하는 것입니다.
$ sed -ne '/<Model500>/,/<\/Model500>/p' file.txt
<Model500>
ABC
BCD
CDE
</Model500>
<Model500>
123
234
345
</Model500>
이 표현식은 /<Model500>/,/<\/Model500>/
행 범위를 지정합니다. 범위는 일치하는 줄로 시작 <Model500>
하고 일치하는 줄로 끝납니다 <\/Model500>
. 대체 명령이 아닌 범위를 지정하므로 표현식은 로 시작하지 않습니다 s
.
방법 2
이스케이프를 원하지 않으면 다른 구분 기호를 사용할 수 있습니다.
$ sed -ne '\|<Model500>|,\|</Model500>|p' file.txt
<Model500>
ABC
BCD
CDE
</Model500>
<Model500>
123
234
345
</Model500>
여기서는 구분 기호로 사용합니다 |
. /
구분 기호 이외의 구분 기호가 범위에 사용되었음을 나타내려면 첫 번째 구분 기호를 이스케이프해야 합니다 \|
.
답변2
문자열에 </Model>
이 /
문자가 포함되어 있으므로 sed 표현식에서 이 문자를 이스케이프하거나 다른 문자를 사용하여 sed 표현식을 구분해야 합니다. 다행스럽게도 sed는 어떤 단일 문자라도 사용하여 표현식을 구분할 수 있으므로 입력에 나타나지 않는 문자만 선택하면 됩니다.
보다 일반적으로 sed는 현재 작업에 가장 적합한 선택이 아닐 수도 있습니다. XML 파일을 구문 분석하는 것 같으므로 sed와 함께 무언가를 해킹하는 대신 XML 구문 분석용으로 구축된 라이브러리를 활용해야 할 것입니다. 바라보다이 게시물이것이 왜 나쁜 생각인지 알아보세요.