패턴과 일치하는 줄을 선택하고 "sed"를 사용하여 바꿉니다.

패턴과 일치하는 줄을 선택하고 "sed"를 사용하여 바꿉니다.

내가 복제하려는 내용은 다음과 같습니다.

$ cat << EOF | { var=$(grep 'foo=');\
 if (( $? == 0 )); then echo "$var"\
| sed -E 's/foo=(.+)/\1/'; else exit 1; fi; }
foo
foo=bar
EOF

술집

독점 사용 sed:

$ cat << EOF | sed -nE '/foo=/p s/foo=(.+)/\1/'
foo
foo=bar
EOF

sed: -e 표현식 #1, 문자 9: 명령 뒤의 추가 문자

오류가 발생한 이유는 무엇입니까? 어떻게 고치나요?

답변1

당신은하려고합니다

sed -n -E '/foo=/ s/foo=(.+)/\1/p' <<'END_INPUT'
foo
foo=bar
END_INPUT

귀하의 명령에는 p초기 주소(정규식 ) 뒤에 가 있으며, 이는 명령의 주소 대신 전체 편집 명령( 후행 쓰레기로 표시됨 ) foo=으로 전환됩니다 .seds/...seds

위 명령에서는 /foo=/후속 명령의 주소입니다 s. 이 s명령은 정규식과 일치하는 모든 줄에 적용됩니다 foo=. 이 -n옵션을 사용 sed하면 각 루프 후에 편집 버퍼를 인쇄하는 것을 방지할 수 있으므로 p명령에서 이 플래그를 사용하여 s수정된 행을 인쇄합니다.

그러나 다음과 같이 쓸 수도 있습니다.

sed -n '/foo=./ s/foo=//p' <<'END_INPUT'
foo
foo=bar
END_INPUT

foo=각 줄의 foo=일부 내용이 뒤따르는 비트를 제거합니다 .

s또는 더 짧게, 명령이 주소로 사용된 정규식을 재사용하도록 함으로써 (그러면 분명히 그렇지 않다고 가정합니다)필요하다) 그리고 그 뒤에 또 무엇이 있는지 foo=,

sed -n '/foo=/ s///p' <<'END_INPUT'
foo
foo=bar
END_INPUT

s또는 더 짧게 말하면, 어쨌든 명령이 정규식과 일치하지 않는 행을 변경하지 않는다는 것을 인식함으로써 ,

sed -n 's/foo=//p' <<'END_INPUT'
foo
foo=bar
END_INPUT

또는 해당 항목이 없는 경우 -n관심 없는 행을 모두 제거하고 관심 있는 행만 수정하고 루프 끝의 기본 출력에 의존하여 다음을 수행합니다.

sed -e '/foo=/!d' -e 's///' <<'END_INPUT'
foo
foo=bar
END_INPUT

관련 정보