sed: 이 줄을 포함하여 일치하는 줄 앞의 모든 줄을 삭제합니다.

sed: 이 줄을 포함하여 일치하는 줄 앞의 모든 줄을 삭제합니다.

표적

이 줄을 포함하여 텍스트 파일에서 일치하는 줄 앞의 모든 줄을 어떻게 삭제합니까?

입력 파일 예:

apple
pear
banana
HI_THERE
lemon
coconut
orange

원하는 출력:

lemon
coconut
orange

목적은 sed(직접 편집)에서 "-i" 옵션을 사용하는 것입니다.

깨끗한 솔루션?

유사한 질문에 대한 대부분의 답변은 비슷한 내용을 제안합니다.

sed -n '/HI_THERE/,$p' input_file

그러나 일치하는 줄은 삭제되지 않습니다.

HI_THERE
lemon
coconut
orange

이를 알면 일치하는 줄(포함)부터 파일 끝까지 모든 내용이 삭제됩니다.

sed '/HI_THERE/,$d' input_file

나는 다음과 같은 것을 시도했습니다 :

sed '^,/HI_THERE/d' input_file

그러나 sed는 다음과 같이 불평했습니다.

sed: -e expression #1, char 1: unknown command: `^'

더러운 해결책

마지막 (더러운) 해결책은 파이프를 사용하는 것입니다.

sed -n '/HI_THERE/,$p' input_file | tail -n +2

그러나 파일을 직접 편집하는 것은 작동하지 않습니다.

sed -n '/HI_THERE/,$p' input_file | tail -n +2 > input_file
cat input_file # returns nothing

이런 임시 파일을 사용해야 하는데...

sed -n '/HI_THERE/,$p' input_file | tail -n +2 > tmp_file
mv tmp_file input_file

답변1

"깨끗한 솔루션"과 유사합니다.

sed -e '1,/HI_THERE/d' input_file

파일의 첫 번째 줄은 1번 줄입니다. ^항상 알고 있기 때문에 특별한 주소가 없으며, $어느 줄인지 모르기 때문에 끝에 있는 while이 필요합니다.

일치하는 라인이 있는 경우첫 번째파일의 줄. GNU sed를 사용 하면 0대신 . 1POSIX sed 및 이식성(이 경우에는 다른 것으로 보임)의 경우 더 복잡합니다(아래 설명 및이 후속 질문).

답변2

Posix sed를 계속 사용하려면 다음을 사용할 수 있습니다.

sed -ne '
  /HI_THERE/!d
  :loop
    n
    p
  bloop
' inp.file

또는 더 간결하게 작성하면 다음과 같습니다.

sed -n '/HI_THERE/!d;:a;n;p;ba' inp.file

답변3

$ perl -ne 'print if 1 <(/HI_THERE/...eof)' input_file

범위 연산자를 사용하여 ...적절한 범위를 형성하고 선택한 범위 내의 첫 번째 요소를 거부하도록 추가로 제한합니다.

답변4

grep -nw HI_THERE file.txt |awk -F":" '{print $1}' | xargs -I % sed '1,%d' file.txt

w설명: 줄 번호를 얻기 위해 정확한 단어 grep을 사용합니다 . n
다음으로 awk를 사용하여 줄 번호를 추출하고 구분 기호는 다음과 같습니다. :
그런 다음 xargs를 사용하여 그때까지 파이프하고 삭제합니다.

관련 정보