그래서 저는 sed를 사용하여 특정 문자열을 찾고 바꿉니다.
사례 1. 파일의 값은 항상 상수입니다. 매개변수를 false에서 true로 바꾸고 싶습니다. 그래서 저는 다음 명령을 사용합니다.
sed -i -e 's/entry key="ignore_vc_cert" value="false"/entry key="ignore_vc_cert" value="true"/g' /usr/local/avamar/var/mc/server_data/prefs/mcserver.xml
ignore_vc_cert
그러면 해당 값을 찾아 에서 false
로 변경합니다 true
. 좋은 결과.
다음으로, 다음 매개변수가 포함된 또 다른 파일이 있습니다.
<numberOfDisk>4</numberOfDisk>
이제 여기의 값은 배포에 따라 변경될 수 있습니다. 4
여기에 있는 숫자나 다른 것을 다음 출력으로 바꾸고 싶습니다.df -h | grep data0* | wc -l
df -h | grep data0* | wc -l
따라서 의 출력이 is이면 매개변수의 값 from을 3
to로 바꿔야 합니다.numberOfDisk
4
3
나는 다음 명령을 썼다:
sed -e s/"$(cat /usr/local/vdr/etc/vdr-configuration.xml | grep -i numberOfDisk)"/<numberOfDisk>"$(df -h | grep data0* | wc -l)"</numberOfDisk>/g > /usr/local/vdr/etc/vdr-configuration.xml
하지만 어떤 이유로 나는numberOfDisk: No such file or directory
만약 내가한다면:
sed -e 's/"$(cat /usr/local/vdr/etc/vdr-configuration.xml | grep -i numberofdisk)"/<numberOfDisk>"$(df -h | grep data0* | wc -l)"</numberOfDisk>/g' /usr/local/vdr/etc/vdr-configuration.xml
그러면 나는 다음을 얻습니다: sed: -e expression #1, char 15: unknown option to
s''
이 문제를 해결하는 방법에 대한 의견이 있으십니까?
답변1
XML 문서를 조작하려면 XML 파서/도구를 사용하십시오.
내가 함께 할게xmlstarlet.
grep -c 'data0*'
- 파이프가 필요 없이 일치하는 라인 수를 출력합니다.wc -l
xmlstarlet ed -u "//numberOfDisk" -v $(df -h | grep -c 'data0*') /usr/local/vdr/etc/vdr-configuration.xml > /tmp/tmp-test.xml
&& mv /tmp/tmp-test.xml /usr/local/vdr/etc/vdr-configuration.xml
ed
- 편집 모드
-u
( --update
) - XML 문서 업데이트
답변2
이 시도. 기존 디스크 번호 이전의 모든 항목을 \1로 가져오고 그 이후의 모든 항목을 \2로 가져옵니다. 그런 다음 \1이 인쇄되고, 그 다음 출력되고 df ...
, 그 다음 \2가 인쇄됩니다.
sed -e 's/\(^.*numberOfDisk>\)[0-9]*\(<.*\)/\1'$(df -h | grep -c data0)'\2/' vdr-configuration.xml
또 다른 (더 짧은) 방법
sed -e '/numberOf/s/[0-9]\+/'$(df -h|grep -c data0)'/' vdr-configuration.xml