1

テキスト ファイルの特定の部分を検索し、2 つのキーワードの間に情報を保存しようとしています。途中の情報だけを保存できる構文はどのようなものですか? 現在、私のコードは次のとおりです。

$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 { ステートメント }
    範囲パターンは、パターン 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

との両方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 に答える