"/test1/end" 뒤에 test1이 포함되지 않은 줄을 삭제하는 방법
test_long_sentence.txt:
20 /test1/catergory="Food"
20 /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20 /test1/type="Western"
20 /test1/theme="Halloween"
20 /test1/end=category
**This is some unwanted data blah blah blah**
20 /test1/Purpose=
20 /test1/my_purpose="To create
a fun-filled moment"
20 /test1/end=Purpose
...
예상 출력:
20 /test1/catergory="Food"
20 /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20 /test1/type="Western"
20 /test1/theme="Halloween"
20 /test1/end=category
20 /test1/Purpose=
20 /test1/my_purpose="To create
a fun-filled moment"
20 /test1/end=Purpose
...
나는 시도했다:
grep -A1 'end' test_long_sentence.txt| sed 'test1/!d' test_long_sentence.txt > output.txt
답변1
노력하다:
$ awk '/test1/{f=0} !f{print} /test1\/end/{f=1}' sentence.txt
20 /test1/catergory="Food"
20 /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20 /test1/type="Western"
20 /test1/theme="Halloween"
20 /test1/end=category
20 /test1/Purpose=
20 /test1/my_purpose="To create
a fun-filled moment"
20 /test1/end=Purpose
어떻게 작동하나요?
awk가 시작되면 정의되지 않은 모든 변수의 기본값은 false입니다. 따라서 awk가 시작되면 오류가 발생합니다 f
. 그런 다음 awk는 각 줄을 차례로 읽고 다음 세 가지 명령을 실행합니다.
/test1/{f=0}
포함된 모든 행에 대해
test1
변수를f
false(0)로 설정합니다.인쇄할 줄 범위 내에 있으면
f
false로 설정됩니다 .!f{print}
false 인 경우
f
현재 줄을 인쇄합니다./test1\/end/{f=1}
포함된 행에 대해 true(1)로
test1/end
설정합니다 .f
이는 포함하는 행에 도달할 때까지 후속 행을 인쇄해서는 안 된다는 것을 나타냅니다
test1
.
변수 사용
awk -v a="test1" -v b="test1/end" '$0~a{f=0} !f{print} $0~b{f=1}' sentence.txt