我正在尝试搜索文本文件的特定部分,并将信息保存在两个关键字之间。语法是什么样的,允许我只保存中间的信息?目前我的代码是:
$awk -f strip.awk <in>out
{
Strip.awk
{
if ($0 == "<!-- start of lyrics -->")
lyr = 1
if ($0=="<!-- end of lyrics -->")
lyr = 0
if(lyr==1)
Lyrics = lyr $0
}
printf("%s/n", Lyrics)
>>Lyric.csv
}
答案 0 :(得分:4)
awk '/<!-- start of lyrics -->/,/<!-- end of lyrics -->/' input.txt >> Lyric.csv
这是我的"The AWK Programming Language" (1984, p23)
:
- 模式1,模式2 {语句}
范围模式匹配从模式1匹配的行到模式2匹配的下一行(包括两者)的每个输入行;语句在每次匹配时执行 line。
范围模式不能成为其中的一部分 任何其他模式。
排除pattern 1
&amp;来自输出范围的pattern 2
:
awk '/pattern 1/,/pattern 2/ {if ($0 !~ /pattern 1|pattern 2/) print}' input.txt
答案 1 :(得分:1)
这个脚本应该这样做:
#!/bin/sh
awk '
/<!-- start of lyrics -->/ { lyrics = 1; next }
/<!-- end of lyrics -->/ { exit }
lyrics { print }
'
如果你称之为script.sh
,那么你可以像这样使用它:
./script.sh < input.txt > lyrics.txt
这是它的工作原理:
/<!-- start of lyrics -->/ { lyrics = 1; next }
:如果该行与开头“模式”匹配,则设置lyrics
变量并跳转到下一行/<!-- end of lyrics -->/ { exit }
:如果该行与结束“模式”匹配,则退出lyrics { print }
:如果设置了lyrics
变量,请打印答案 2 :(得分:0)
“仅保存中间的信息”并不完全清楚你的意思,但假设你的意思是你只想打印两个分隔符之间的内容:
awk '/<!-- start of lyrics -->/{p=1}/<!-- end of lyrics -->{p=0}p{print}0' input.txt
应该工作。
它基本上根据是否已经看到开始/结束标记来设置和重置标志,并且仅在标志非零时打印行。
答案 3 :(得分:0)
sed
和awk
都支持regex ranges
。
$ cat ff
1
2
3
4
START
4
5
3
6
7
END
14
5
8
$ awk '/START/,/END/' ff
START
4
5
3
6
7
END
$ sed -n '/START/,/END/p' ff
START
4
5
3
6
7
END