예를 들어:
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
찾습니다 .-