SED 함수를 사용하여 특정 단어가 포함된 줄을 삭제하는 방법

SED 함수를 사용하여 특정 단어가 포함된 줄을 삭제하는 방법

다음을 포함하는 .txt 파일이 있습니다.

ID       VALUE
test     value_1
testing  value_2
first    value_3
second   value_4

주어진 ID에 해당하는 행을 삭제하는 쉘 스크립트를 작성하려고 합니다. 예를 들어, ID가 "test"인 행을 삭제하고 싶었기 때문에 포럼에서 다음과 같은 방법으로 "sed" 기능을 사용할 수 있다는 것을 알았습니다.

sed -i '/test/d' file.txt

그러나 이 함수는 ID가 "testing"인 행도 삭제합니다. 해당 단어가 "test"라는 단어와 복합되어 있기 때문입니다. 또한 이 함수는 각 행을 확인하므로 "test"라는 단어가 포함된 값이 있으면 해당 값도 제거됩니다.

그래서,

  • ID가 각 행의 시작 부분에 있는 경우 ID 열에 "test"라는 단어만 포함된 모든 행을 어떻게 확인하고 삭제할 수 있습니까? 또한 단어로 시작하는 모든 행을 어떻게 확인하고 삭제할 수 있는지 질문할 수도 있습니다. "시험"?
  • ID가 "test"이고 "test"라는 단어가 복합되지 않은 경우에만 삭제하는 방법(이 경우 "testing"이 삭제됩니다.)
  • "sed" 기능이 정말 충분할까요?

감사해요

답변1

또는 \b\s^

\b단어 경계와 일치하고 ^줄의 시작 부분과 일치합니다.

sed -i '/^test\b/d' file.txt

\b열이 공백으로 구분된 경우 \s대신 공백 문자 일치를 고려하세요.

충분한가 sed?

예.


다음은 명령줄 텍스트 처리의 다른 "일반적인 용의자"(대부분)에 대한 간략한 언급입니다.

또는 비슷한 목적으로 사용하는 경우도 있습니다 grep. 특히 파일 복사본을 처리하거나, 출력을 리디렉션하거나, 출력을 다른 유틸리티로 스트리밍하려는 경우에는 더욱 그렇습니다.

grep -v '^test\b' file.txt 

또는 -w단어 일치를 사용하십시오.

grep -vw '^test' file.txt

둘 다 출력:

ID       VALUE
testing  value_2
first    value_3
second   value_4

고급 스크립팅 언어를 사용하게 되면 더 많은 다른 강력한 옵션을 사용할 수 있습니다. awk좋은 중간 옵션이며 다음과 같이 양식 입력을 처리하는 데 적합합니다.

awk 'NR > 1 && $1 != "test" { print $1,":",$2 }' test.txt

NR > 1첫 번째 줄(헤더 줄)을 건너뛰고 $1 != "test"정규식 대신 간단한 문자열 비교를 사용합니다(비록 동일하게 사용할 수 있음 !/^test /). 이 { print ... }블록은 콜론으로 구분된 첫 번째와 두 번째 열을 인쇄합니다(가능한 내용 중 일부를 보여주기 위해 임의임).

testing : value_2
first : value_3
second : value_4

따라서 awk훌륭한 학습 도구입니다. 그 후에는 Perl, Python 등과 같은 프로그래밍 언어의 전체 영역에 들어갑니다. 단일 라인 프로그램이나 대규모 소프트웨어 제품군에서 사용할 수 있습니다.

답변2

@type_outcast

답변 주셔서 감사합니다. 해결책을 찾았기 때문에 내 질문에 대한 답을 선택했습니다. 포럼에서 특정 단어로 시작하는 모든 사람을 삭제하는 방법을 찾았습니다.

sed '/^test/ d'

그래서 다음 줄을 사용하여 "결합"합니다.

sed -i '/^test\b/d' file.txt

결국 다음과 같이 보입니다.

sed /^\btest\b/ d

마지막 명령줄을 사용하면 단어 경계 "test"로 시작하는 모든 줄을 삭제할 수 있습니다.

관련 정보