Linux sed 정규식 이스케이프

Linux sed 정규식 이스케이프

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모든 노드의 속성 값을 다음 속성으로 업데이트합니다.valuepropertynameport

xmlstarlet ed -u '//property[@name="port"]/@value' -v "$NEWPORT" file.xml

XPATH 표현은 //property[@name="port"]/@value" value속성이 다음과 같은 노드에 속하는 property속성 "을 의미합니다. 선택한 속성은 (포트 번호로 가정)로 설정됩니다.nameport$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내부에 올바른 디코딩이 있습니다(예: -- &amp;> &등).

정규식을 사용하여 XML 유사 데이터를 구문 분석하는 어려움과 관련된 문제:

답변3

이 시도

sed -i "s/name=\"port\" value=\"8954\"/$NEWPORT/g" config.xml

관련 정보