표적
이 줄을 포함하여 텍스트 파일에서 일치하는 줄 앞의 모든 줄을 어떻게 삭제합니까?
입력 파일 예:
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
대신 . 1
POSIX 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를 사용하여 그때까지 파이프하고 삭제합니다.