`sed`와 파일에 here-doc 사용


10

sed 명령에 here-doc을 사용하고 읽을 파일과 출력 파일을 제공하고 싶습니다.

고급 Bash 스크립팅 안내서의 Here-Documents 를 살펴 보았지만 here-doc을 사용할 때 일반적인 인수에 대해서는 언급하지 않았습니다. 가능합니까?

다음과 같은 것을 성취하고 싶습니다.

#!/bin/bash
OUT=/tmp/outfile.txt
IN=/my_in_file.txt

sed $IN << SED_SCRIPT
    s/a/1/g
    s/test/full/g

SED_SCRIPT 
> $OUT;

도움을 주셔서 감사합니다.

답변:


14

GNU sed에게 표준 입력에서 스크립트를 읽도록 지시 할 수 있습니다 -f -. -f즉, 파일에서 스크립트를 읽거나 -많은 명령에서 공통적으로 표준 입력을 의미합니다.

sed -f - "$IN" > "$OUT" << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT

POSIX sed는 또한 지원 -f하지만 -표준 입력 사용은 문서화되어 있지 않습니다. 이 경우 /dev/stdinLinux 시스템에서 사용할 수 있습니다 (Solaris도 마찬가지라고 생각하지만 지금은 확인할 수 없습니다)

사용 <<-SED_SCRIPT( '-'는 접두사은) 닫는 수 SED_SCRIPT태그 들여 쓰기 수 있습니다.


감사합니다, 당신이 말한 것, 닫는 토큰을 들여 쓸 수 없다는 것을 지적하고 싶습니다. 그렇지 않으면 bash에 오류가 발생합니다. 닫는 것에 공백도 포함되어 있기 때문이라고 가정합니다.
Tristian

Apple OS X sed는 표준 입력에서 스크립트를 읽는 것을 지원하지 않습니다. (적어도 그와 같은 방식이나 다른 문서화 된 방식은
아닙니다

@danorton : 저는 추가 한 솔루션 의 지원이 필요하지 않습니다 -f -에를 sed하지만 공정 대체가 필요합니다 <( command ).
pabouk

5

에서 sed스크립트 읽기를 지원하지 않는 경우 stdin(을 사용하여 -f -) 프로세스 대체 ( bash,, zsh에서 사용 가능)를 사용할 수 있습니다 ksh93.

sed "$IN" > "$OUT" -f <( cat << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT)

닫는 괄호 )SEC_SCRIPT즉시 또는 줄 바꿈 뒤에 끝 구분 기호 ( )를 따라야합니다 . 프로세스 대체의 경우 echohere 문서 대신 사용할 수도 있습니다 .

sed "$IN" > "$OUT" -f <( echo \
"    s/a/1/g
    s/test/full/g" )

1
맥 OS X, 그것은 입력 파일 (좋아하지 않았다 "$IN"또는 testfile.txt즉시 나오지 명령 자체 다음) - 그것은 원 -e script이나 -f file. @pabouk의 답변을 다시 정리했습니다.sed -f <( cat << ETC ... ETC) "$IN" > "$OUT"
Stephen P

bash 4.2.45 및 표준 BSD sed를 사용하는 Max OSX에서 닫는 괄호닫는 줄 아래에 새 줄에 있어야합니다 SED_SCRIPT.
Alexander Klimetschek

-1

아마도 더 좋은 접근 방식입니다.

OUT=/dev/stdout

IN=my_in_file.txt
sed -s 's/in/out/' < $IN > $OUT
  -or-
sed -s 's/in/out/' > $OUT < $IN

IN=my_in_text
sed -s 's/in/out/' <<< $IN > $OUT
  -or-
sed -s 's/in/out/' > $OUT <<< $IN

:)


1
흥미롭지 만 요점 외에. OP는 stdin을 통해 sed 명령을 전달하려고합니다.
muru

이 접근 방식은 두 방법을 모두 허용합니다. 왜 다운 보트입니까?
Magnus

"stdin을 통해 sed 명령 통과"를 반복하십시오. 당신은 어떤 방법으로도 그렇게하지 않습니다.
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.