패턴과 일치하는 줄을 찾아 삭제하는 방법은 무엇입니까?


14

줄이 많은 파일에서로 시작하는 줄을 삭제하고 싶습니다 HERE IT IS.

명령 줄 도구 만 사용하여이 작업을 수행하려면 어떻게해야합니까?


2
약간 틀에 얽매이지 않지만 다음 vim과 같이 사용할 수 있습니다 . vim '+g/^HERE IT IS/d' +wq test.txt;)
Doorknob

@Doorknob, 이것을 지적 해 주셔서 감사합니다. 사실은 내가 정력 사용하는 내 방식에있어
micgeronimo을

답변:


28

시도 sed:

sed -i '/^HERE IT IS/d' <file>

경고 :-i 스위치를 사용하는 경우 백업을 수행하는 것이 좋습니다 sed.

sed -i.bak '/^HERE IT IS/d' <file>

원본 파일은 그대로 유지되고 <file>.bak수정 된 파일은 그대로 유지됩니다 <file>.


일치하는 문자열 뒤에 줄 바꿈 문자를 넣고 줄 바꿈에 쓰려면 어떻게해야합니까?
micgeronimo 2019

2
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
heemayl 2019

1
@micgeronimo : 기꺼이 도와 드리겠습니다. 편집 내용을 확인하십시오.
heemayl

6
@micgeronimo는 정리 / 삭제 될 수있는 주석이 아닌 원래 질문에 실제로 답변하려는 질문을하려고합니다 (편집 할 수 있음을 기억하십시오). 사용할 수 있습니다 sed '/^HERE IT IS/G' file.
steeldriver

1
sed 사용법은 매우 프로입니다.
LakshyaAg 2019

18

아주 좋은 이외에 grepsed당신이받은 답변, 여기에 같은 일을 할 수있는 다른 도구는 다음과 같습니다

  • 몇 가지 펄 방법 :

    perl -ne '/^HERE IT IS/ || print' file > newfile
    perl -ne 'print if !/^HERE IT IS/' file > newfile
    perl -ne 'print unless /^HERE IT IS/' file > newfile
    

    -i파일을 편집하기 위해 스위치를 예제에 추가 할 수 있습니다 .

    perl -i.bak -ne '/^HERE IT IS/ || print' file        
    
  • (둔한 사람

    awk '!/^HERE IT IS/' file > newfile
    

    GNU awk( awkLinux 의 기본값 )의 최신 버전 (4.1.1 이상 )도 파일을 제자리에서 편집 할 수 있습니다.

    gawk -i inplace  '!/^HERE IT IS/' file
    
  • 쉘 ( bash, zsh, ksh, 아마 다른 사람). 이것은 어리석은 일이지만 수는 있지만 다른 도구가 더 좋습니다.

    while IFS= read -r line; do 
      [[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
    done < file > newfile
    

1
당신은 단지 과시입니다! ;-) (그러나 똑똑하고 많은 것을 배웠고 bash저를 LOL로 만들었 기 때문에
공감대를 얻었습니다

bash는 printf "%s\n" "$line"$ line을 인용하여 공백을 보존하고 에코 문제를 피합니다 (특수 문자 해석 등). 추가 할 필요 --도 없습니다.
Olivier Dulac

@OlivierDulac 공정합니다. 나는 프린지 경우에 복잡한 일을하지 않았지만 Cuanglm 추가 이후 IFS=-r, 나뿐만 아니라 갈 모든 방법과 견고 할 수 있습니다.
terdon

@ terdon : 그것은 더 나은 선을 위해 모두 ^^ (그리고 초보자에게는 매우 유익하기 때문에 이미 +1 했음)
Olivier Dulac

2
@OlivierDulac 유닉스 및 리눅스 에 게시하는 경우 printf, IFS =, -r 및 따옴표를 사용했을 것입니다. :) 나는 종종 커맨드 라인에 익숙하지 않은 AU 청중을 위해 일을 단순화합니다.
terdon

13

grep그것들을 걸러내는 데 사용 합니다. 예를 들면 다음과 같습니다.

grep -v "^HERE IT IS" infile > outfile

그런 다음 outfile을 다시 infile로 이동하십시오.


영리한 사고
Anwar

5

sed 확실히 갈 길입니다.

@heemayl 명령을 약간 수정하면 패턴 참조의 I로 인해 동일한 사례가 패턴에 사용되는지 여부에 관계없이 줄을 삭제할 수 있습니다.

sed -i '/HERE IT IS/Id' <file>

이 작업을 수행하려는 디렉토리에 여러 파일이 있으면 찾은 파일과 결합 할 수 있습니다.

find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +

maxdepth 옵션은 이것이 디렉토리로 재귀하지 않음을 의미합니다.


4

다른 파이썬 옵션 :

#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]

여기서 f는 따옴표 사이의 파일 경로입니다.


4

그렙

grep -P '^(?!HERE IT IS)' file

(?!HERE IT IS)네거티브 lookahead 어설 션은 정규식 엔진 이 문자열 다음에 오는 경우에만 모든 줄 시작 경계 ( 일반적으로와 일치^ )를 일치 시킵니다.HERE IT IS

파이썬

#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
    for line in f:
        if not line.startswith('HERE IT IS'):
            print(line, end="")

스크립트를 파일에 저장 한 script.py다음 터미널에서 아래 명령을 통해 실행하십시오.

python3 script.py infile

와 같은 정규 표현식을 사용할 수는 [print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)]있지만보다 효율적이지 않습니다 startswith. [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]목록에서 출력을 생성하지 않는 방법 이 궁금합니다 .
Avinash Raj

내가 처음 만났을 때, 나에게는 이상해 보였다. 정의 된 목록의 모든 항목에 대해 인쇄 명령 (또는 원하는 작업)을 생성합니다.
Jacob Vlijm

재미를 위해 그것을 삭제 :)
Jacob Vlijm

1

Ex 모드에서 Vim을 사용할 수 있습니다 :

ex -sc 'g/^HERE IT IS/d' -cx file
  1. g 글로벌 검색

  2. d 지우다

  3. x 저장하고 닫습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.