sed 오류 : "`s '명령의 RHS에 대한 잘못된 참조 \ 1"


103

maven 에 대한 colorize 스크립트 의 핵심으로 몇 가지 대체 명령을 실행합니다 . sed명령 중 하나는 여기에 설명 된 대로 쉘에서 찾을 수있는 정규식을 사용합니다 . 현재 (작동하지 않는) 구현은 여기 에서 찾을 수 있습니다 .

명령의 변형 중 하나를 스크립트에 포함하면 다른 동작이 발생합니다.

변형 1 :

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"

스크립트에 적용 :

-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \

오류 : 셸이를 입력하는 것과 동일한 정보를 출력합니다 $ sed. 이상한!?


변형 2 :

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"

스크립트에 적용 :

-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \

오류:

sed : -e 식 # 7, char 59 :`s '명령의 RHS에 대한 잘못된 참조 \ 1


10
내 경우에는 내가 결합했다 -i와 (장소 옵션 편집) -re의 결과로, -ire(그래서 -i소비 한 re그와 같은 단편 SUFFIX인수 따라서 확장 된 정규식 모드가 활성화되지되었다); -i -re문제를 해결 하기 위해 변경합니다 .
Janaka 다라

특히 .NET을 해석 할 때 작은 따옴표 '와 큰 따옴표 "가 약간 다르게 취급 된다는 점에 유의해야합니다 $vars. 예 : sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"작동하지만 : sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'작동하지 않습니다.
not2qubit

답변:


51

작동하기 위해 실제로 캡처 할 필요가 없습니까? 즉 변형 2 :

-r -e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \

(참고 : 테스트되지 않음)

-r 인수가 없으면 역 참조 (예 : \ 1)가 작동하지 않습니다.


42
-r나오지도 나타납니다에 대한 옵션은 작업에 백 참조를 위해 필요합니다. 예를 들어 sed -e 's/([[:digit:]])/is a digit/'작동하지만 sed sed -e 's/([[:digit:]])/\1 is a digit/하지 않고 원래 오류를 생성합니다 -r. 참고 : 리터럴에 대한 나오지 검색의 첫 번째 호출 (<digit>)과는 아닙니다 캡처 그룹.
Andrew Falanga

답변 아래의 설명은 실제로 답변입니다. 답변을 수정하여 반영 할 수 있습니다.
miroxlav

당신은 대답으로 당신의 코멘트를 게시해야 @AndrewFalanga
삼매 관청

2
내 실수는 사용 -ire대신 사용 하는 것이 었습니다 -ri. 주문 문제 :-)
m3nda

54

이 오류는 이스케이프되지 않은 괄호에 일반적입니다. 탈출하고 다시 시도하십시오.


예를 들면 :

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n(.)/\1/g

각 괄호 앞에 백 슬래시로 이스케이프해야합니다.

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n\(.\)/\1/g

6
주의, 사용하는 경우 -r괄호를 이스케이프 할 필요가 없습니다.
qräbnö

13

는 IF -r/의 --regexp-extended옵션이 제공되지 않으며, 다음 캡처 괄호 이스케이프해야합니다.


5

당신은 /후 탈출 필요.

sed -e "s/\([a-zA-Z0-9.\/\\ :-]\+\)/\1/g"

또는 탈출에 대해 걱정하고 싶지 않다면 |

sed -e "s|\([a-zA-Z0-9./\\ :-]\+\)|\1|g"

편집하다:

sed -e "s|WARNING: \([a-zA-Z0-9.-/\\ :]+\)|${warn}WARNING: \1${c_end}|g"

합리적으로 들립니다. 그러나 스크립트의 컨텍스트에서는 작동하지 않습니다.
JJD

죄송합니다. 편집으로 인해 오류가 발생 sed: -e expression #7, char 58: Invalid range end합니다.. @Denis의 대답이 작동합니다.
JJD

2
알겠습니다. @Denis '답변에 +1
slackmart
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.