从文本文件中获取范围模式中的特定行

时间:2013-06-27 19:51:32

标签: regex perl sed awk pattern-matching

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

$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 个答案:

答案 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)

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