sed -i를 사용하여 xml 파일의 포트 값을 바꾸었습니다.
<property name="port" value="8954" />
하지만 정규식을 피하는 방법을 모르겠습니다. 정규식이 아래에 있습니다.
(?<=name="port"\s+value=")\d+(?=")
내 명령은
sed -i "s/${PORTREX}/$NEWPORT/g" config.xml
답변1
나는 이것이 이미 해결책이라는 것을 깨닫지 못했기 때문에 이것을 댓글에 썼습니다. OP는 작동하도록 작성했으므로 이번에는 답변으로:
sed "s/\(name=\"port\" *value=\"\)[0-9]*/\1$NEWPORT/g" config.xml
OP에서 제안한 정규식은 일부 비표준 확장을 사용하므로 작동하지 않지만 sed
필요하지는 않습니다.
sed -i를 사용하여 xml 파일의 포트 값을 바꾸었습니다.
하지만 정규식을 피하는 방법을 모르겠습니다. 정규식이 아래에 있습니다.
- "lookbehind" 대신 문자열을 있는 그대로 사용할 수 있지만 하위 표현식으로
(?<=somestring)
표시\(somestring\)
하고 교체에서 재사용하므로\1
"이것은 있어야 하지만 대체할 수 없습니다"라고 말하는 대신 간단히 교체하세요. 그리고 그 자체 - 은 (하나 이상 발생)
+
의 단축어 이지만 로\{1,\}
바꿀 수도 있습니다 . 이 경우 단순을 사용하면 0번 발생이 불가능하므로 시간이 절약될 수 있습니다.a+
aa*
*
- 내 생각에는 독서는 독서
\d
보다 더 중요 하지 않다.[0-9]
\s
[[:space:]]
또는 로 대체할 수 있습니다[ <literal tab>]
. 여기 간단한 공간이 그 일을 할 것입니다
결론: 거의 모든 정규식 확장은 쉽게 피할 수 있으며 약간 장황하거나 읽기 어려운 패턴이 발생할 수 있지만 일반적으로 단점은 없습니다.한 가지 예외는 탐욕스럽지 않은 일치입니다. 어떤 경우에는 일치 없이 다른 개념이 필요합니다.
답변2
XML 문서에서 XMLStarlet을 사용하여 file.xml
모든 노드의 속성 값을 다음 속성으로 업데이트합니다.value
property
name
port
xmlstarlet ed -u '//property[@name="port"]/@value' -v "$NEWPORT" file.xml
XPATH 표현은 //property[@name="port"]/@value
" value
속성이 다음과 같은 노드에 속하는 property
속성 "을 의미합니다. 선택한 속성은 (포트 번호로 가정)로 설정됩니다.name
port
$NEWPORT
예:
$ NEWPORT=8080
$ xmlstarlet ed -u '//property[@name="port"]/@value' -v "$NEWPORT" file.xml
<?xml version="1.0"?>
<root>
<property name="port" value="8080"/>
</root>
이를 사용하여 XML을 수정하는 것은 어렵습니다. 특히 전혀 지원되지 않는 Perl과 같은 정규식을 sed
사용하려는 경우 더욱 그렇습니다 . sed
줄 지향 도구를 사용하여 XML을 처리하면 개행 배치 및 줄 내 노드 속성의 상대적 위치와 관련된 잠재적인 문제가 발생할 수도 있습니다(참고, <property name="port" value="8954" />
와 동일 <property value="8954" name="port" />
). 문자열 인코딩 역시 sed
해결 가능한 잠재적인 문제 입니다.~하지 않는 한sed
내부에 올바른 디코딩이 있습니다(예: -- &
> &
등).
정규식을 사용하여 XML 유사 데이터를 구문 분석하는 어려움과 관련된 문제:
답변3
이 시도
sed -i "s/name=\"port\" value=\"8954\"/$NEWPORT/g" config.xml