문자열에서 중간에 마침표가 없는 모든 단어를 제거하려는 사용 사례가 있습니다. 누구든지 솔루션을 제공할 수 있나요? 그렇다면 어떻게 작동하는지 설명해 주시겠습니까?
문자열 예:
Testy.mctestface 1337 taco
원하는 결과:
Testy.mctestface
답변1
사용 grep
:
grep -oE '\w+\.\w+'
\w+
- 임의의 단어 문자 일치(같음 [a-zA-Z0-9_]
)
+
- 수량자 - 한 번 및 무한히 일치, 가능한 한 여러 번 일치, 필요에 따라 반환(탐욕)
\.
- 문자 그대로 문자 일치 .
(대소문자 구분)
옵션은 반환을 -o
의미합니다 .grep
오직이 옵션을 사용하면 일치 시 -E
정규식을 확장할 수 있습니다 .
이는 기본적으로 마침표가 포함된 모든 단어 또는 단어 조합과 일치합니다.
$ echo 'foo bar Testy.mctestface 1337 taco' | grep -oE '\w+\.\w+'
Testy.mctestface
단어에 특수 문자가 포함될 수 있는 경우 다음을 사용할 수 있습니다.
grep -oE '\S+\.\S+'
\S+
공백이 아닌 문자를 한 번부터 무한번까지 일치 시킵니다 .
답변2
아마도:
sed '
s/.*/ & /
:1
s/ [^ .]\{1,\} / /g
t1
s/^ //;s/ $//'
답변3
답변의 약간 간단한 버전은 다음과 같습니다 awk
.
awk '{ for (i=1; i<=NF; i++) if ($i !~ /\./) $i = ""; print; }'
만약 각 단어에 대해아니요지점을 포함하고 파괴하세요. 그런 다음 나머지를 인쇄하십시오.
질문을 다시 읽었을 때 "각 단어... 마침표 없이"라고 되어 있는 것을 발견했습니다.존재하다가운데~에". 예를 들어 다음을 입력하십시오.
Mr. Smith ate .5 pies in New York.
어떤 단어에도 마침표가 없으므로 출력이 생성되어서는 안 됩니다.중간에. 대조적으로,
Mr.Smith ate 1.5 pies in New York.
보고되어야 Mr.Smith
하며 1.5
따라서 명령은 다음과 같아야 합니다.
awk '{ for (i=1; i<=NF; i++) if ($i !~ /.\../) $i = ""; print; }'
만약 각 단어에 대해아니요마침표와 하나 이상의 다른 문자가 포함되어 있어 단어가 손상됩니다.
답변4
와는 별개로grep또는sed,당신이 사용할 수있는 awk
:
{
for(i=1; i <= NF; i++)
if ($i ~ /\./)
out=out" "$i
print out
out=""
}
...파일에 저장하고 awk -f thatfile input1 input2...
다음을 통해 실행합니다.
awk '{ for(i=1; i <= NF; i++) if ($i ~ /\./) out=out" "$i; print out; out="" }' input
...명령줄에 스크립트를 입력합니다.
awk는 공백(특수 변수의 기본값)을 기준으로 FS
각 입력 줄을 자동으로 분할합니다 . 스크립트는 해당 분할의 각 결과 필드를 반복하고 테스트를 실행합니다. 필드 값에 마침표가 포함된 경우(마침표는 정규 표현식의 특수 표시이기 때문에 이스케이프됨) 해당 필드를 공백과 함께 추가합니다. 출력할 새 필드에 끝에 문자열. 이는 마침표가 포함되지 않은 필드를 건너뛰는 효과가 있습니다. 필드에 대한 루프가 완료되면 재구성된 값(in out
)을 인쇄하고 입력에 더 많은 행이 있는 경우 빈 문자열로 재설정합니다.