"something.swf" 패턴과 일치하지 않는 txt 파일의 모든 콘텐츠를 삭제하세요.

"something.swf" 패턴과 일치하지 않는 txt 파일의 모든 콘텐츠를 삭제하세요.

sed이것이 가능합니까 awk? 내가 하고 싶은 것은 이 패턴과 일치하지 않는 모든 것을 제거하는 것입니다.'(something).swf'

이러한 명령은 필요 없으며 저는 초보자입니다. 텍스트 처리는 터미널을 통해 이루어지므로 출력을 표시할 뿐만 아니라 텍스트 파일로 저장하고 싶습니다.

예.

다음과 같이 입력하면:

Hey stackoverflow im 23 years old 'lol.swf' and '33.swf'

다음과 같이 출력되어야 합니다.

'lol.swf'
'33.swf'

답변1

나는 단지 grep을 사용합니다(여기서 GNU를 가정 grep):

grep -o "'[^']*\.swf'" input.txt > output.txt

설명하다

  • -o전체 라인이 아닌 일치하는 부분만 인쇄하십시오.
  • "'[^']*\.swf'""포함할 수 있도록 일치시킬 패턴입니다 '. 이는 첫 번째 문자 '와 일치하고 그 뒤에는 [^']*결정되지 않은 수의 비 '문자가 오고 그 뒤에는 ( 정규 표현식에서 특별한 의미가 있으므로 이스케이프 .swf해야 합니다 ..\..
  • input.txt읽을 입력 파일입니다.
  • > output.txt출력이 이 파일로 리디렉션됩니다. 이 섹션을 제거하면 화면에서 출력을 미리 볼 수 있습니다.

선택하다

GNU가 설치되어 있지 않으면 grep다음을 시도해 볼 수 있습니다(terdon에서 영감을 얻었습니다)대안아이디어).

tr -d '\n' <input.txt | tr "'" '\n' | head -n -1 | tail -n +2 | grep '.*\.swf$' > output.txt

설명하다

  • tr -d '\n' <input.txtinput.txt모든 개행 문자( )를 읽고 제거합니다 \n.
  • tr "'" '\n'모두 '개행 문자로 변환하세요. 이는 모든 줄이 앞에 둘러싸여 있음을 의미합니다 '.
  • head -n -1 | tail -n +2. 그러나 원본 텍스트 파일이 로 시작하거나 something.swf'끝나는 경우 'something.swf에는 하나만 있어도 한 줄을 차지하며 '다음 오류로 감지됩니다 grep. 그러나 첫 번째 또는 마지막 문자열에 두 개의 따옴표가 올바르게 포함되어 있으면 이 단계의 시작이나 끝 부분에 추가 줄 바꿈이 있습니다. 따라서 이 코드는 이 시나리오에만 일치하도록 마지막 줄과 첫 번째 줄을 제거합니다.
  • grep '\.swf$'로 끝나는 줄과 일치합니다 .swf.

답변2

grep지원하지 않으면 다음을 사용할 -o수 있습니다 perl.

perl -lne "print for /'.*?\.swf'/g" < in.txt > out.txt

그리고 sed:

sed -n "/\('[^']*\.swf'\)/{s//\n\1\n/;s/.*\n\(.*\n\)/\1/;P;D;}"

이는 다음과 같습니다.

awk '
  {
    while(match($0, '"/'[^']*\.swf'/"')) {
      print substr($0, RSTART, RLENGTH)
      $0 = substr($0, RSTART+RLENGTH)
    }
  }'

( 패턴 공간의 첫 번째 줄은 루프에서 제거되었습니다.) D.sed

답변3

awk한 가지 방법 은 다음과 같습니다 .

$ awk "{for(i=1;i<=NF;i++){if(\$i~/'[^']*.swf'/){print \$i}}}" file
'lol.swf'
'33.swf'

GNU가 아닌 grep도 있습니다. 모든 공백을 줄 바꿈으로 변경하고 일반을 사용하십시오 grep.

$ sed 's/ /\n/g' file | grep "'[^']*.swf'"
'lol.swf'
'33.swf'

관련 정보