.xml 파일을 처리하는 스크립트를 작성하려고 합니다. 요소가 포함된 모든 행을 찾아 <title>
복사한 다음 찾은 요소 뒤의 다음 행에 붙여넣고 요소 유형도 변경해야 합니다. 여기에 예가 있습니다.
원래:
일부 텍스트
<title>
텍스트 1</title>
일부 텍스트
<title>
텍스트 2</title>
일부 텍스트
이것이 내가 얻어야 할 것입니다:
일부 텍스트
<title>
텍스트 1</title>
<description>
텍스트 1</description>
일부 텍스트
<title>
텍스트 2</title>
<description>
텍스트 2</description>
일부 텍스트
sed나 grep(또는 다른 도구)을 사용하여 수행할 수 있나요?
답변1
sed -E 's%<title>(.*)</title>%<title>\1</title>\n<desc>\1</desc>%g' file.xml
숙제를 해야 합니다.
좀 더 설명하자면,
-E
매개변수는 sed
확장 정규식을 사용하도록 지시하므로 따옴표를 사용할 수 있습니다. 일반적으로 sed 형식의 sed로 대체됩니다 s/search/replace/g
. 검색 텍스트에 슬래시가 있으므로 sed %
대신 /
sed를 사용하여 해당 부분을 표시하므로 검색 텍스트에서 슬래시를 백슬래시로 가릴 필요가 없습니다. 나머지는 검색 섹션의 코드 조각을 \1
참조하는 교체 섹션이 있는 일반적인 정규식 항목입니다.(…)
답변2
XML 파서/프로세서는 XML 데이터를 조작하는 데 적합한 도구입니다.
xmlstarlet해결책:
데모 input.xml
내용:
<root>
some text
<title>text 1</title>
some text
<title>text 2</title>
some text </root>
xmlstarlet ed -a '//title' -t elem -n 'description' -v '' input.xml \
| xmlstarlet ed -u '//description' -x './preceding-sibling::title[1]/text()'
산출:
<?xml version="1.0"?>
<root>
some text
<title>text 1</title><description>text 1</description>
some text
<title>text 2</title><description>text 2</description>
some text </root>
ed
- 편집 모드-a
- 추가 조치-u
- 업데이트 작업