sed 명령의 here-doc를 사용하고 읽을 파일과 출력 파일을 제공하고 싶습니다.
나는 본 적이여기에 파일Advanced Bash Scripting Guide에 있지만 여기에 설명된 일반 매개변수 사용에 대해서는 언급하지 않습니다. 가능합니까?
저는 다음과 같은 목표를 달성하고 싶습니다.
#!/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;
어떤 도움이라도 대단히 감사하겠습니다.
답변1
sed를 사용하여 GNU sed가 표준 입력에서 스크립트를 읽도록 지시할 수 있습니다 -f -
. -f
이는 파일에서 스크립트를 읽는다는 의미이며, -
많은 명령에서 공통적으로 사용되는 표준 입력을 의미합니다.
sed -f - "$IN" > "$OUT" << SED_SCRIPT
s/a/1/g
s/test/full/g
SED_SCRIPT
POSIX sed도 지원되지만 -f
표준 입력 사용은 -
문서화되어 있지 않습니다. 이 경우 /dev/stdin
Linux 시스템에서 이것을 사용할 수 있습니다. (Solaris에도 이것이 있다는 것을 기억하는 것 같지만 지금은 확인할 수 없습니다.)
(접두사 "-")를 사용하면 <<-SED_SCRIPT
닫는 SED_SCRIPT
태그를 들여쓸 수 있습니다.
답변2
(사용하여) 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
) 또는 개행 문자 바로 뒤에 와야 합니다. 프로세스 대체의 경우 echo
여기에 있는 문서를 대신 사용할 수도 있습니다.
sed "$IN" > "$OUT" -f <( echo \
" s/a/1/g
s/test/full/g" )
답변3
다음과 같이 여러 표현식을 사용하는 것은 어떨까요 -e
?
#!/bin/bash
OUT=/tmp/outfile.txt
IN=/my_in_file.txt
sed
-e "s/a/1/g" \
-e "s/test/full/g" \
$IN > $OUT
더 작은 인라인 sed 스크립트의 경우 더 읽기 쉽습니다. 그런데 sed의 내부 편집을 사용할 수도 있습니다.
sed -i.org
-e "s/a/1/g" \
-e "s/test/full/g" \
$IN
이렇게 하면 원본 파일이 입력 파일 아래에 저장 ${IN}.org
되고 변경 사항이 입력 파일에 적용됩니다.
답변4
어쩌면 더 나은 접근 방식이 있을 수 있습니다.
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
:)