나는 이것에 익숙하지 sed
않고 그것을 작동시키는 데 약간의 문제가 있습니다.
내가 원하는 것은 이것이다:
abc.ztx.com. A 132.123.12.44 ---> abc.ztx.com
다음 패턴을 사용했지만 작동하지 않는 것 같습니다.
echo "abc.ztx.com. A 132.123.12.44" | sed 's/\.\s.+//g'
regex101.com을 사용하여 정규식을 확인했는데 패턴이 \.\s.+
해당 부분 과 . A 132.123.12.44
완벽하게 일치했습니다. 왜 작동하지 않습니까 sed
?
도움을 주셔서 감사합니다. 감사해요.
답변1
sed
POSIX 기본 정규식(BRE)이 기본적으로 사용됩니다. \s
BRE와 동등한 PCRE(Perl 호환 정규 표현식)입니다 [[:blank:]]
(공백과 탭 또는 [[:space:]]
더 큰 공백 문자 세트와 일치한다고 생각합니다). BRE +
와 동등한 POSIX 확장 정규식(ERE) 수정자 입니다 \{1,\}
.
그러니 시도해 보세요
sed 's/\.[[:blank:]].*//'
대신에. [[:blank:]]
탭 문자를 일치시킬 필요가 없으면 공백 문자로 바꿀 수 있습니다.
sed 's/\. .*//'
g
일치하는 항목은 하나만 있으므로 대체를 위해 플래그를 사용할 필요가 없습니다 . 또한 다른 문자가 있는지 전혀 신경 쓰지 않기 때문에 .+
사용한 것을 .*
대신 대체할 수 있습니다(모두 제거하기만 하면 됩니다)..\{1,\}
관련된:
답변2
Gnu/Linux나 다른 Gnu를 사용한다면 Gnu sed를 갖게 될 것입니다. Gnu sed에는 -r
이를 허용하는 옵션이 있습니다.
-r
정규식 방언을 변경하는 옵션이 추가되었습니다.
예를 들어
echo "abc.ztx.com. A 132.123.12.44" | sed -r 's/\.\s.+//g'
답변3
귀하의 질문은 구체적으로 요청되었지만 구현에 sed
사용하겠습니다 .cut
후행점을 수락할 수 있는 경우 다음을 수행하세요.
$ echo "abc.ztx.com. A 132.123.12.44" | cut -d" " -f1
abc.ztx.com.
후행 점을 참을 수 없다면 다음을 수행하십시오.
$ echo "abc.ztx.com. A 132.123.12.44" | cut -d" " -f1 | rev | cut -d. -f2- | rev
abc.ztx.com
또는:
$ echo "abc.ztx.com. A 132.123.12.44" | cut -d" " -f1 | sed -e "s/\.$//"
abc.ztx.com
답변4
또 다른 가능성은 을 사용하고 awk
필드 .
구분 기호로 (마침표 + 공백)을 지정하는 것입니다.
echo "abc.ztx.com. A 132.123.12.44" | awk -F '\\. ' '{print $1}'
abc.ztx.com