파일의 다른 줄에 있는 여러 문자를 비교해야 할 때 파일의 줄을 어떻게 삭제할 수 있습니까?

파일의 다른 줄에 있는 여러 문자를 비교해야 할 때 파일의 줄을 어떻게 삭제할 수 있습니까?

예를 들어:

xx.txt 파일의 내용은 다음과 같습니다.

Hi
How Are You Doing
Its Been Long Time
Hope Everything Is Fine

따라서 단어가 포함된 줄을 삭제해야 하는 경우행위또는아름다운.

xx.txt 파일의 출력은 다음과 같아야 합니다.

Hi
Its Been Long Time

sed단일 또는 명령을 사용하여 awk이를 수행할 수 있습니까 ?

답변1

이 시도,

인쇄물:

sed '/Doing\|Fine/d' xx.txt 

파일에서 해당 행을 직접 삭제하려면 다음을 수행하십시오.

sed -i '/Doing\|Fine/d' xx.txt 

답변2

grep -vE "Doing|Fine" xx.txt 

"Doing and Fine"이라는 단어 없이 모든 줄을 인쇄합니다.

답변3

awk '$0 !~/Fine|Doing/' i.txt  

산출

Hi
Its Been Long Time

답변4

단어가 포함된 모든 줄을 제거하려면 Doing다음 Fine을 사용할 수 있습니다 grep.

grep -Fw -v -e 'Doing' -e 'Fine' file

-F옵션은 grep주어진 표현식을 다음과 같이 사용합니다.while은 정규 표현식이 아닌 -w전체 단어와 일치합니다(예: Doings또는 등의 다른 단어의 하위 문자열이 아님 Fines). 이 -v옵션은 주어진 표현식과 일치하는 행이 출력에서 ​​제거되도록 테스트의 의미를 반전시킵니다. 두 문자열은 -e쿼리할 표현식을 제공하는 데 사용되는 에 의해 제공됩니다(이 옵션은 일반적으로 생략되지만 두 개가 있으므로 여기서는 필요합니다).


그것으로 sed당신은 할 수 있습니다

sed -e '/\<Doing\>/d' -e '/\<Fine\>/d' file

또는

sed '/\<Doing\>/d; /\<Fine\>/d' file

또는

sed -E '/\<(Doing|Fine)\>/d' file

이들 각각은 두 개의 문자열을 단어로 일치시킵니다. \<특수 패턴은 \>단어의 시작과 끝에서 각각 너비가 0인 공백(단어 문자와 비단어 문자 사이의 공백)과 일치합니다. GNU의 경우 and 대신 and를 sed사용할 수 있습니다 .\b\<\>

마지막 sed명령은 교대를 사용하여 단어를 일치시킵니다. 대체는 확장 정규식의 기능이므로 -E명령줄에서 이러한 기능을 활성화합니다.

모든 경우에 패턴은 각 입력 줄과 일치하며, 일치하면 명령을 사용하여 제거됩니다 d. 다른 모든 줄은 인쇄됩니다.

대신, 일치하지 않는 모든 행을 인쇄하고 나머지는 무시하는 방법은 다음과 같습니다.

sed -n -E '/\<(Doing|Fine)\>/!p' file

즉, data 의 기본 출력을 끄고 -n( ) 및 ( ) 패턴과 p일치하지 않는 행만 인쇄합니다.!


코드는 awk다음과 같습니다굉장히 유사한sed적어도 GNU를 사용할 때는 확장 정규식을 사용하여 코드를 작성합니다( 및 awk이해 ).\<\>

awk '!/\<(Doing|Fine)\>/' file

또는

awk '!/\<Doing\>/ && !/\<Fine\>/' file

둘 다 두 단어를 입력 데이터와 일치시키려고 시도하며 해당 단어가 있으면 데이터가 인쇄되지 않습니다.

index()에서 함수를 사용할 수도 있지만 awk이 경우 단어를 하위 문자열로 찾을 수도 있습니다( 를 사용하는 것과 마찬가지로 /(Doing|Fine)/).

awk '!index($0, "Doing") && !index($0, "Fine")' file

index($0, string)string(전체 행)에서 찾을 수 없으면 0을 반환하므로 $0음수 결과를 사용 !하면진짜문자열을 찾을 수 없으면 이 값이 반환됩니다.

가장 일반적인 방법 awk은 각 필드를 개별적으로 확인하는 것입니다.

awk '{ for (i = 1; i <= NF; ++i) if ($i == "Doing" || $i == "Fine") next; print }' file

이는 이 두 단어에 대해 각 필드를 테스트하고 단어 중 하나가 발견되면 즉시 다음 입력 줄로 이동합니다. 그렇지 않으면 해당 줄이 인쇄됩니다.

유사한 단어가 텍스트에 나타나면 /\<(Doing|Fine)\>/다른 결과가 나타날 수 있습니다 . 루프는 필드를 공백으로 구분하기 때문에 찾지 못하지만 정규 표현식 에서는 단어가 아닌 문자 때문에 A-Doing찾습니다 .-

관련 정보