![Bash에서 일치하지 않는 줄 제거](https://linux55.com/image/179567/Bash%EC%97%90%EC%84%9C%20%EC%9D%BC%EC%B9%98%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%A4%84%20%EC%A0%9C%EA%B1%B0.png)
다음을 포함하는 텍스트 파일이 있습니다.
Today, 12:34https://...
Today, 12:43https://...
Yesterday, 13:21https://...
Nottoday, 12:32https://
"오늘" 또는 "어제"와 일치하지 않는 모든 행을 삭제하려고 합니다.
이 포럼에서 모드가 하나만 있는 sed 명령을 발견하고 "today" 행만 포함된 텍스트 파일에 대해 다음을 시도했습니다.
sed -n '/Yesterday/p' file.txt
또는
sed '/Yesterday/!d' file.txt
하지만 아무것도 삭제되지는 않습니다. "오늘" 또는 "어제"를 포함하지 않는 모든 행을 제거하는 방법을 알려 주시겠습니까?
답변1
Sed는 파일을 수정하지 않습니다(플래그가 제공되지 않는 한 -i
이를 제공하는 구현에 대해). 아래와 같이 파일을 읽고 표준 출력에 씁니다.
$ sed -n '/Yesterday/p' file.txt
Yesterday, 13:21https://...
$ cat file.txt
Today, 12:34https://...
Today, 12:43https://...
Yesterday, 13:21https://...
Nottoday, 12:32https://
Today
Nor 와 일치하지 않는 모든 줄을 삭제하려면 Yesterday
Ed 편집기를 사용할 수 있습니다.
printf '%s\n' 'v/Today\|Yesterday/d' w q | ed -s file.txt
v
역방향 전역 명령이므로 일치하지 않거나 삭제되는 d
모든 줄이 삭제됩니다 . 변경사항을 작성하고 종료합니다. Ed의 플래그는 자동 모드로 실행됩니다.Today
Yesterday
w
q
-s
-i
플래그와 함께 Sed를 사용할 수도 있습니다 .
sed -n -i '/Yesterday\|Today/p' file.txt
답변2
파일의 내부 편집을 사용하려면 sed
비표준 -i
옵션이 필요합니다.
# GNU syntax à la perl (now also in busybox, NetBSD, OpenBSD):
sed -i -e /Yesterday/b -e /Today/b -e d your-file
# FreeBSD syntax (also in derivatives like macOS):
sed -i '' -e /Yesterday/b -e /Today/b -e d your-file
이 b
sed
명령은 확장되고( b
다른 언어의 next
/ 와 동일) 패턴 공간도 제거됩니다(결국 인쇄되지 않음). 따라서 or가 포함된 행을 제외한 모든 행을 삭제합니다.continue
d
d
Yesterday
Today
또는 다음을 사용하십시오 perl
( 구현 -i
의 일부를 차용 sed
).
perl -i -ne 'print if /(Yester|To)day/' your-file
기준기초적인sed
or 에서 사용하는 정규식에는 대체 연산자가 ed
없지만 여러 구현에서는 대체 연산자로 전환 해야 합니다.|
sed
-E
확장하다sed
정규식(이 옵션은 POSIX 사양의 다음 버전에도 나타날 것입니다 ed
).
sed -Ei '/(Yester|To)day/!d' your-file
GNU 구현은 sed
또한 \|
기본 정규식에서 이를 대체 연산자( -E
/ 제외)로 지원합니다 -r
.
sed -i '/\(Yester\|To\)day/!d' your-file
답변3
awk와 Python의 두 가지 방법을 통해 완료됨
주문하다
awk '!/Today|Yesterday/' filename
산출
Nottoday, 12:32https:
파이썬
#!/usr/bin/python
import re
h=re.compile(r'Today|Yesterday')
k=open('p','r')
for i in k:
if not re.search(h,i):
print i.strip()
산출
Nottoday, 12:32https: