샘플 input.xml
파일
<user dn="CN=company,DN=Department">
<role name="ROLE_ADMIN"/>
</user>
출력은
<user dn="String_1,String_2">
<role name="ROLE_ADMIN"/>
</user>
위의 문제 설명에 관한 제안 사항을 알려주십시오. 참고: 값이 비어 있을 수도 있으므로 dn을 하드코딩해서는 안 됩니다. 예를 들어 dn=""
답변1
XML 로 작업하는 대신 sed
다음과 같은 XML 인식 도구를 사용하십시오 xmlstarlet
.
xmlstarlet ed -u '/user/@dn' -v 'String1, String2' input.xml
답변2
명령줄 XML 파서/편집기 사용XML 스타:
$ company="The Company"
$ department="The Department"
$ dn="CN=$company,DN=$department"
$ xml ed -t -u '/user/@dn' -v "$dn" input.xml
<?xml version="1.0"?>
<user dn="CN=The Company,DN=The Department">
<role name="ROLE_ADMIN"/>
</user>
dn
이 명령은 루트 노드의 속성을 찾아 user
해당 값을 $dn
확장된 값으로 편집합니다.
나중에 속성을 더 쉽게 구문 분석할 수 있도록 속성 값에서 회사 이름과 다음 항목 사이에 더 눈에 띄는 구분 기호를 사용하는 dn
것이 좋습니다 . DN
예 ;
를 들어 ,
. 또는 user
노드 에 별도의 속성으로 추가합니다 .
답변3
라인이 항상 독립적 이라면 <user...>
이는 sed의 간단한 표현입니다.
sed "s/^<user .*/<user dn=\"$string1,$string2\">/" input.xml
이제 이렇게 작성하면 $string1
및 $string2
둘 다 변수가 됩니다.
예를 들면 다음과 같습니다.
$ string1="hello"
$ string2="there"
$ sed "s/^<user .*/<user dn=\"$string1,$string2\">/" input.xml
<user dn="hello,there">
<role name="ROLE_ADMIN"/>
</user>
sed -i
를 재정의하는 "내부" 대체를 사용할 수 있습니다 input.xml
.
답변4
sed
당신의 친구입니다
sed '/^<user dn=/s/CN=[^,]*,DN=[^"]*\"/String_1,String2/' filename
그것은 이루어져야합니다. String_1
실시간으로 &를 선택하려면 변수를 사용하여 이를 달성할 수 있습니다. String_2
나는 대본을 쓸 것이다
#!/bin/bash
read -p"Enter string1" str1
read -p"Enter string2" str2
sed -i "/^<user dn=/s/CN=[^,]*,DN=[^\"]*\"/$str1,$str2/" /path/to/input.xml
이 -i
옵션은 파일을 즉시 수정합니다.
노트
큰따옴표는 bash 변수 확장을 허용하기 때문에 sed 스크립트에서 사용됩니다. 그러나 같은 이유로 패턴 자체에서 큰따옴표를 이스케이프했습니다.