![텍스트를 sed로 바꾸고 원본 텍스트의 일부를 유지합니다.](https://linux55.com/image/17768/%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20sed%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EA%B3%A0%20%EC%9B%90%EB%B3%B8%20%ED%85%8D%EC%8A%A4%ED%8A%B8%EC%9D%98%20%EC%9D%BC%EB%B6%80%EB%A5%BC%20%EC%9C%A0%EC%A7%80%ED%95%A9%EB%8B%88%EB%8B%A4..png)
변환하려고 하는데
<id>1</id>
<Name>ENTERPRISE RESOURCE PLANNING</Name>
도착하다:
<column name="id">1</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING</column>
작업에 가장 적합한 도구는 이라고 가정 sed
하지만 교체 부분에서 원본 텍스트의 일부를 유지하는 방법을 모르겠습니다.
만약 내가한다면:
$ sed -i 's/<.*>.*<.*>/<column name="\\1">\\2<\/column>/g' filename.xml
출력은 다음과 같습니다
<column name="\1">\2</column>
<column name="\1">\2</column>
또는 내에서 비슷한 작업을 수행하면 vi
다음과 같이 출력됩니다.
<column name=""></column>
<column name=""></column>
합계를 원래 값으로 다시 바꾸려면 \1
어떻게 해야 합니까?\2
답변1
예를 들어 다음과 같이 그룹을 사용할 수 있습니다.
$ sed -i 's/<\(.*\)>\(.*\)<.*>/<column name="\1">\2<\/column>/g' filename.xml
아마도 RE에서 가장 혼란스러운 부분은 여러 구문 스타일로 제공된다는 점일 것입니다.
예를 들어 sed와 vim을 사용하면기본 정규식()
메타 의미를 얻으려면 인용해야합니다 .
그리고확장 정규식()
(예: awk, egrep 등) 문자 그대로의 의미를 얻으려면 인용해야 합니다 . 다른 메타문자에도 비슷한 차이점이 있습니다.
BRE 의미론의 근거는 ()
대부분의 입력이 C 코드인 경우 메타 사용 시 괄호를 인용하는 것이 더 실용적이라는 것입니다.
답변2
사용 xmlstarlet
:
name
값이 있는 모든 노드와 노드에id
속성을 추가 하거나 필요에 따라 추가합니다.Name
id
Name
- 모든
name
및id
노드의 이름을 로 바꿉니다column
.
xmlstarlet ed \
-s '//id' -t attr -n name -v id \
-s '//Name' -t attr -n name -v Name \
-r '//id' -v column \
-r '//Name' -v column file.xml
다음과 같은 샘플 문서가 주어지면
<root>
<id>1</id><Name>ENTERPRISE RESOURCE PLANNING</Name>
<id>2</id><Name>ENTERPRISE RESOURCE PLANNING (the return)</Name>
</root>
(노드 사이의 공백은 중요하지 않습니다.) 결과는 다음과 같습니다.
<?xml version="1.0"?>
<root>
<column name="id">1</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING</column>
<column name="id">2</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING (the return)</column>
</root>