XML에서 한 줄의 일부를 찾고 그 값을 업데이트하려면 Linux에서 sed를 사용해야 합니까?

XML에서 한 줄의 일부를 찾고 그 값을 업데이트하려면 Linux에서 sed를 사용해야 합니까?

sedLinux를 사용하여 XML에 부분 일치가 있는 경우 XML의 변수 값을 고정 값으로 업데이트 해야 합니다 .

예:

입력값:

<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="A" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">

요구 사항은 버전 값에 "6.02"가 있을 때마다 버전 값을 6.02로만 업데이트하는 것입니다. 따라서 출력은 다음과 같습니다.

<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="A" version="6.02">

참고: tableName="Data"고정된 값이지만 PGPU_ID, DBactionversion는 다를 수 있습니다. 따라서 tablename ="Data"versionis 가 있을 때마다 6.02명령 sed은 버전을 6.02로만 바꾸고 다른 값은 정확히 동일하게 유지해야 합니다.

답변1

사용 xmlstarlet:

xmlstarlet ed -u '//Table/@version[ ../@tableName = "Data" and contains(.,"6.02") ]' -v '6.02' file.xml

version이렇게 하면 각 노드의 모든 속성을 찾을 수 있습니다 Table. 해당 값을 Table가진 속성에 속하는 노드를 선택합니다.tableNameData 그리고하위 문자열을 포함합니다 6.02. 이는 문자열로만 업데이트됩니다 6.02.

결과는 표준 출력에 기록되며, 여기에서 새 파일로 리디렉션하거나 xmlstarlet ed --inplace -u ...문서를 제자리에서 편집하는 데 사용할 수 있습니다(주의해서 사용).

답변2

부인 성명:XML 파일을 자동으로 변경하지 않음 sed 자신이 하고 있는 일에 대해 정말로 확신이 없다면 말이죠. 스크립트 실패의 예를 만들어내는 것은 종종 쉽습니다. 이 경우, oldversion="..." 예를 들어 일치합니다.

sed 's/version="\([^",]*,\)*6.02\(,[^",]*\)*"/version="6.02"/g'

16.02버전 번호 또는 이면 교체가 필요하지 않으므로 6.021스키마 생성이 다소 보기 흉해집니다. [^",]*,쉼표나 큰따옴표 뒤에 쉼표가 없는 모든 문자열과 일치하므로 \([^",]*,\)*이러한 필드 중 0개 이상이 일치됩니다. 그렇게 하면 이전에 숫자나 어떤 것도 없는지 확인할 수 있습니다 6.02. 버전 번호 뒤의 필드도 마찬가지입니다.

답변3

작동 할까요 awk?

awk '$2~/tableName="Data"/ && $5 ~ /[*",.^]6.02[$.,"*]/ { $5 = "version=\"6.02\">" }1'
  • 입력하다
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="A" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="B" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="C" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="D" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.06,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="E" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="F" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.09,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="G" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="H" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="I" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.04,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="J" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="K" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="L" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">
  • 산출
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="A" version="6.02">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="B" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="C" version="6.02">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="D" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.06,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="E" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="F" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.09,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="G" version="6.02">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="H" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="I" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.04,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="J" version="6.02">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="K" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="L" version="6.02">

관련 정보