문자열에서 특정 문자가 누락된 단어를 제거하시겠습니까?

문자열에서 특정 문자가 누락된 단어를 제거하시겠습니까?

문자열에서 중간에 마침표가 없는 모든 단어를 제거하려는 사용 사례가 있습니다. 누구든지 솔루션을 제공할 수 있나요? 그렇다면 어떻게 작동하는지 설명해 주시겠습니까?

문자열 예:

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)을 인쇄하고 입력에 더 많은 행이 있는 경우 빈 문자열로 재설정합니다.

관련 정보