수색…
쉘 변수를 사용한 대체
작은 따옴표 안에 변수 '
그래서에서 쉘 변수 사용, POSIX 호환 쉘에 의해 확장되지 않습니다 sed
대체를 따옴표의 사용이 필요합니다 "
대신 작은 따옴표를 '
:
$ var="he"
$ echo "hello" | sed "s/$var/XX/"
XXllo
$ var="he"
$ echo "hello" | sed 's/$var/XX/'
hello
변수를 평가할 때 명령 주입에주의하십시오.
$ var='./&/;x;w/etc/passwd
> x;s/he'
$ echo "hello" | sed "s/$var/XX/"
sed: /etc/passwd: Permission denied
위의 내용이 루트로 실행되면 첫 번째 예와 출력을 구분할 수 없게되고 /etc/passwd
의 내용이 삭제됩니다.
역 참조
이스케이프 된 대괄호를 사용하면 \1
을 사용하여 대체 문자열에서 역 참조 할 수있는 패턴으로 캡처 그룹을 정의 할 수 있습니다.
$ echo Hello world! | sed 's/\(Hello\) world!/\1 sed/'
Hello sed
여러 그룹으로 :
$ echo one two three | sed 's/\(one\) \(two\) \(three\)/\3 \2 \1/'
three two one
확장 정규 표현식 ( 추가 옵션 참조)을 사용할 때 괄호는 기본적으로 그룹화를 수행하므로 이스케이프 할 필요가 없습니다.
$ echo one two three | sed -E 's/(one) (two) (three)/\3 \2 \1/'
three two one
문자, 숫자 및 밑줄로 구성된 단어는 [[:alnum:]_]\{1,\}
표현식을 사용하여 일치시킬 수 있습니다.
$ echo Hello 123 reg_exp | sed 's/\([[:alnum:]_]\{1,\}\) \([[:alnum:]_]\{1,\}\) \([[:alnum:]_]\{1,\}\)/\3 \2 \1/'
reg_exp 123 Hello
시퀀스 \w
는 [[:alnum:]_]
과 동일합니다 [[:alnum:]_]
$ echo Hello 123 reg_exp | sed 's/\(\w\w*\) \(\w\w*\) \(\w\w*\)/\3 \2 \1/'
reg_exp 123 Hello
다른 구분 기호 사용
POSIX / IEEE Open Group Base 사양 은 다음과 같이 말합니다 :
[2addr] s / BRE / 대체 / 플래그
패턴 공간에서 BRE의 인스턴스를 대체 문자열로 대체하십시오. 슬래시 대신에 백 슬래시 또는 개행 문자 이외의 문자 를 사용하여 BRE와 대체 문자 를 구분할 수 있습니다. BRE 및 교체에서 BRE 구분 기호 자체 앞에 백 슬래시가 오는 경우 리터럴 문자로 사용할 수 있습니다.
구분 기호 때 경우가 있습니다 /
에 sed
교체와 같은 오류를 트리거링 BRE 또는 교체에있다 :
$ echo "2/3/4" | sed "s/2/3/X/"
sed: -e expression #1, char 7: unknown option to `s'
이를 위해 #
또는 _
또는 심지어 공백과 같은 다른 구분 기호를 사용할 수 있습니다.
$ echo "2/3/4" | sed "s#2/3#X#"
X/4
$ echo "2/3/4" | sed "s_2/3_X_"
X/4
$ echo "2/3/4" | sed "s 2/3 X "
X/4
패턴 플래그 - 발생 대체
한 라인에서 첫 번째 어커런스 만 바꾸려면 sed
를 평소와 같이 사용합니다.
$ cat example
aaaaabbbbb
aaaaaccccc
aaaaaddddd
$ sed 's/a/x/' example
xaaaabbbbb
xaaaaccccc
xaaaaddddd
그러나 모든 사건을 대체하고 싶다면 어떻게해야할까요?
마지막에 g
패턴 플래그를 추가하기 만하면됩니다.
$ sed 's/a/x/g' example
xxxxxbbbbb
xxxxxccccc
xxxxxddddd
그리고 하나의 특정 사건을 대체하고 싶다면 실제로 어떤 사건을 지정할 수 있습니다.
$ sed 's/a/x/3' example
aaxaabbbbb
aaxaaccccc
aaxaaddddd
/3
은 세 번째 발생입니다.
info sed
에서 온라인 버전의 GNU sed 매뉴얼 을 참조하십시오.
POSIX 표준은
g
와 NUMBER 수식어를 섞을 때 어떤 일이 일어나는지 지정하지 않으며, 현재sed
구현을 통해 널리 합의 된 의미가 없다. GNUsed
의 경우 상호 작용은 다음과 같이 정의됩니다. NUMBERth 이전에 일치하는 항목을 무시한 다음 NUMBERth의 모든 일치 항목을 일치시키고 바꿉니다.
$ sed 's/b/y/2g' example
aaaaabyyyy
aaaaaccccc
aaaaaddddd
$ sed 's/c/z/g3' example
aaaaabbbbb
aaaaacczzz
aaaaaddddd