특정 패턴 이전의 모든 단어를 삭제하고 싶습니다. 예를 들어, 그 이전의 모든 단어를 삭제하고 싶습니다 STAC
.
입력하다:
asd
asdd
asddd
STAC
asd
as
산출:
STAC
asd
as
이 코드가 있습니다sed -ni "s/^.*STAC//d" myfile
답변1
sed
행별로 작동하므로 시도가 작동하지 않습니다.
그럼 어떻게 해야 할까요 sed
? STAC
줄( /^STAC$/
)부터 시작하여 파일 끝( )까지의 주소 범위를 정의합니다 $
. 이것들은 인쇄되어야 하므로 다른 모든 것( !
)은 제거되어야 합니다 d
:
sed -i '/^STAC$/,$!d' myfile
답변2
awk
일치 항목(일치 항목 포함) 이후의 모든 줄을 인쇄하는 변형:
$ awk '/^STAC$/ { out=1 } out' file
STAC
asd
as
이는 문자열만 포함하는 행과 일치하며 0이 아닌 값으로 STAC
설정됩니다 . out
~을 위한각줄이 out
0이 아니면 인쇄합니다.
정규식 일치 대신 문자열 비교 $0 == "STAC"
에 대체를 사용합니다 ./^STAC$/
정규식 일치의 부울 결과를 정수(일치 없음의 경우 0, 일치의 경우 1)로 사용하면 약간 더 혼란스럽지만 더 짧습니다.
awk 'p += /^STAC$/' file
결과 p
가 0이 아닌 경우(즉, 정규식이 처음 일치하는 지점부터 시작하여) 현재 줄이 인쇄됩니다.
정규식 일치 대신 문자열 비교 p += ($0 == "STAC")
에 대체를 사용합니다 .p += /^STAC$/
답변3
또 다른 옵션은 다음과 같은 스크립트 가능한 편집기를 사용하는 것입니다 ed
.
printf '%s\n' '1,/^STAC/-1 d' 'wq' | ed -s myfile
그러면 두 가지 명령이 인쇄됩니다 ed
.
- 1부터 (로 시작하는 줄 앞의 줄
STAC
) 까지의 줄을 삭제합니다. - 파일을 다시 디스크에 쓰고 종료합니다.
이 -s
옵션은 ed
읽고 쓴 바이트 수의 기본 인쇄를 비활성화합니다.
답변4
grep -wn STAC file.txt | cut -d":" -f 1 | xargs -I % sed '1,%d' file.txt
단어의 줄 번호를 가져와서 xargs에 전달하고 sed를 사용하여 삭제합니다.