1

我正在尝试搜索文本文件的特定部分并将信息保存在两个关键字之间。允许我只保存中间信息的语法是什么样的?目前我的代码是:

$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

}
4

4 回答 4

4
awk '/<!-- start of lyrics -->/,/<!-- end of lyrics -->/' input.txt >> Lyric.csv

这是来自我的副本"The AWK Programming Language" (1984, p23)

  • 模式 1 ,模式 2 { statements }
    范围模式匹配从模式 1 匹配的行到模式 2 匹配的下一行的每个输入行,包括在内;语句在每个匹配行执行。

    范围模式不能是任何其他模式的一部分。

从输出范围中排除pattern 1& :pattern 2

awk  '/pattern 1/,/pattern 2/ {if ($0 !~ /pattern 1|pattern 2/) print}' input.txt
于 2013-06-27T20:15:04.863 回答
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设置了变量,则打印该行
于 2013-06-27T20:11:34.100 回答
0

尚不完全清楚“仅保存中间的信息”是什么意思,但假设您的意思是只想打印两个分隔符之间的内容:

awk '/<!-- start of lyrics -->/{p=1}/<!-- end of lyrics -->{p=0}p{print}0' input.txt

应该工作。

它基本上根据是否看到开始/结束标签来设置和重置标志,并且仅在标志非零时打印行。

于 2013-06-27T20:12:26.827 回答
0

两者sedawk支持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
于 2013-06-27T20:56:27.720 回答