sed
Linux를 사용하여 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
, DBaction
및 version
는 다를 수 있습니다. 따라서 tablename ="Data"
및 version
is 가 있을 때마다 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
가진 속성에 속하는 노드를 선택합니다.tableName
Data
그리고하위 문자열을 포함합니다 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">