Bash에서 일치하지 않는 줄 제거

Bash에서 일치하지 않는 줄 제거

다음을 포함하는 텍스트 파일이 있습니다.

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://

TodayNor 와 일치하지 않는 모든 줄을 삭제하려면 YesterdayEd 편집기를 사용할 수 있습니다.

printf '%s\n' 'v/Today\|Yesterday/d' w q | ed -s file.txt

v역방향 전역 명령이므로 일치하지 않거나 삭제되는 d모든 줄이 삭제됩니다 . 변경사항을 작성하고 종료합니다. Ed의 플래그는 자동 모드로 실행됩니다.TodayYesterdaywq-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가 포함된 행을 제외한 모든 행을 삭제합니다.continued dYesterdayToday

또는 다음을 사용하십시오 perl( 구현 -i의 일부를 차용 sed).

perl -i -ne 'print if /(Yester|To)day/' your-file

기준기초적인sedor 에서 사용하는 정규식에는 대체 연산자가 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:

관련 정보