나는 처음 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