4

私はファイルを持っています

foo
--
bar

セパレーターの上の行のみが必要です。私はこれに長い間苦労しており、いくつかのバリエーションを試しました。私のワンライナーは次のとおりです。

echo -e "foo\n-- \nbar" | gawk -v x=0 -- '/^--\ / { x++ } ; IF (x==0) {print} '

これは「foo」のみを出力するはずですが、ファイル全体が出力されます。print x に変更すると、

0
1
1

x の値に基づいて awk に条件付きで行を出力させることができないようです。私は単純なものが欠けていることを知っています。

4

4 に答える 4

4

これをやってみてください:

echo -e "foo\n-- \nbar" | awk '/^--/{exit}1'

説明

  • /^--/現在の行の先頭にある文字列に一致する正規表現です
  • {}条件がの場合に部分が実行されます(前の正規表現)
  • 1のようなもの{print}です: デフォルトでawkは、条件がtrueの場合に STDOUT に出力します。awkに1当てはまりますが、現在の行を出力します。

コマンドの分解:

echo -e "foo\n-- \nbar" | awk '
    {
        if (/^--/) {
            exit
        }
        else {
            print
        }
    }
'

別の分解:

echo -e "foo\n-- \nbar" |
awk '(/^--/) { exit }
             { print }'

これは、パターンとアクションのルールが 2 つあることを強調しています。明示的なパターンと終了アクションを持つもの。もう 1 つは、暗黙的なパターンと印刷アクションを使用します。

于 2012-12-01T17:41:37.227 に答える
2

あなたがsedもっと好きなら:

sed -n '/^--$/q;p' file.txt

説明:sedファイルを 1 行ずつ読み取ります。sed がパターン^--$(つまり、正確に を含む行--) を見つけた場合は終了します (それがqコマンドです)。それ以外の場合は、sedその行の内容を (pコマンドで) 出力します。sedはオプションで起動されたことに注意してください-n。つまり、コマンドで明示的に指示されない限り、何も出力しませんpsedセパレーター--が見つかったとき (つまり、コマンドの前) に終了するためp、このセパレーターは出力されません。

良い点は、このタスクsedよりも高速であることです。awk

編集。グレン・ジャックマンがコメントで指摘しているように、GNU sed を使用すると、以下を使用できます。

sed '/^--$/Q' file.txt

(私が答えたとき、私はコマンドsedを持っていたコンピューターにいませんでした)。Qありがとうグレン。

于 2012-12-01T18:00:44.223 に答える
1

元のスクリプトは正しい行にありましたが、複雑すぎました。

echo -e "foo\n-- \nbar" | gawk '/^--\ / { x++ } { if (x==0) print}'

変数は自動的に作成され、ゼロに設定されawkます (そのため、etc は必要ありません-v x=0)。「ダブルダッシュを見つける」コードは問題ありませんでした。セミコロンは不要です (せいぜい)。はIF (x == 0) {print}明らかに奇妙です。Mac OS X 10.7.5のawkはそれを受け入れますが、それが何をしていたのかわかりません。x置換アクションはすべての行に対して行われ、印刷前にゼロかどうかをテストします。

個人的には、おそらくこれに使用sedします:

echo -e "foo\n-- \nbar" | sed '/^--/q'

gniourf_gniourfが示唆するように私のsedコマンドを修正します:

echo -e "foo\n-- \nbar" | sed -n '/^--/q;p'

sputnick回答awkで示されているコマンドを使用して、それを模倣できます。

echo -e "foo\n-- \nbar" | awk '/^--/ {exit} 1'

1 はすべての行に一致し (常に真)、デフォルトのアクションである「print $0」をトリガーします。次のように書くこともできます。

echo -e "foo\n-- \nbar" | awk '/^--/ {exit} {print}'
于 2012-12-01T17:58:12.553 に答える
1

GNU awk では、レコード セパレータを「--」のみを含む行に設定し、最初のレコードを出力するだけです。

$ gawk -v RS='\n--\n' 'NR==1' file
foo

または、パフォーマンスが懸念される場合:

$ gawk -v RS='\n--\n' 'NR==1{print;exit}' file
foo

そうすれば、後でスクリプトを拡張して、必要な他のレコードを印刷できます。

$ cat file
the
quick
--
brown
fox
--
jumped
$
$ gawk -v RS='\n--\n' 'NR==1' file
the
quick
$ gawk -v RS='\n--\n' 'NR==2' file
brown
fox
$ gawk -v RS='\n--\n' 'NR==3' file
jumped
于 2012-12-02T14:54:57.947 に答える