Sed의 그룹화 워크플로

Sed의 그룹화 워크플로

누구든지 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 

관련 정보