누구든지 sed 그룹화가 어떻게 작동하는지 설명할 수 있습니까? 나는 "Sed and Awk 101"이라는 책을 팔로우하고 있습니다.
이 개념은 나에게 신비한 것 같습니다.
답변1
예:
$ FOO="1234567890 one two three ABCDEF"
$ echo "$FOO" | sed "s|\(1.*0\).*\(A.*F\)|\2 \1|"
ABCDEF 1234567890
=> SED에게 일치시켜 \(1.*0\).*\(A.*F\)
다음으로 바꾸라고 지시합니다.group2 group1
그룹 문은 \(
다음으로 시작하고 끝납니다.\)
\(1.*0\)
"1"로 시작하고 "0"으로 끝나는 모든 패턴과 일치하여 그룹 1이 됩니다..*
여러 문자 일치(모든 유형)\(A.*F\)
"A"로 시작하고 "F"로 끝나는 모든 패턴과 일치하여 그룹 2가 됩니다.
그룹은 예를 들어 \N으로 대체될 수 있습니다. 여기서 N은 그룹 번호입니다.
\1
그룹 1이므로 여기는 "1234567890"입니다.\2
그룹 2이므로 여기는 "ABCDEF"입니다.
답변2
그룹화는 ()
일반적으로 나중에 교체되는 (정규식) 부분을 사용하여 수행됩니다.
기본 정규식을 사용하여 ()
특별한 의미를 얻으려면 이스케이프 해야 합니다 \(stuff\)
. 예를 들어
echo "Bash Pitfalls" | sed -E 's/Pit(falls)/\1/'
당신을 위한
Bash falls
-E
확장 정규 표현식을 사용하도록 설정하면 이스케이프할 필요가 없습니다 ()
.
분명히 이것은 잘 사용되지 않으며 ()
보다 실용적인 용도는 ()
와일드카드를 발생과 결합하는 것입니다.
{}
패턴의 발생 횟수를 계산하는 데 사용됩니다 . 확장 정규 표현식이 없으면 다음과 같아야 합니다\{\}
.- sed의 내용은
[]
언급 범위입니다. 예를 들어[0-9]
0에서 9까지의 숫자,[a-z]
a에서 z까지의 모든 문자 등과 일치합니다.
더 실제적인 예
$ echo "Match" | sed -E 's/([HM]{1}at)ch/\1/'
Mat
$ echo "Hatch" | sed -E 's/([HM]{1}at)ch/\1/'
Hat
$ echo "Catch" | sed -E 's/([HM]{1}at)ch/\1/'
Catch