내가 복제하려는 내용은 다음과 같습니다.
$ 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=
으로 전환됩니다 .sed
s/...
sed
s
위 명령에서는 /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