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.txt
input.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'