다음을 포함하는 .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"로 시작하는 모든 줄을 삭제할 수 있습니다.