텍스트를 sed로 바꾸고 원본 텍스트의 일부를 유지합니다.

텍스트를 sed로 바꾸고 원본 텍스트의 일부를 유지합니다.

변환하려고 하는데

<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:

  1. name값이 있는 모든 노드와 노드에 id속성을 추가 하거나 필요에 따라 추가합니다.NameidName
  2. 모든 nameid노드의 이름을 로 바꿉니다 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>

관련 정보