0

この形式のテキストファイルがあります[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]

「[ONE.+]」を1行ずつ出力したい。

出力例は次のようになります。

[ONE testing 1 2 3]
[ONE 123]

試してみましawk '/\[ONE.+\]/ { print $1 }'たが、うまくいきませんでした。誰か教えてくれませんか?そして、正しい方法は何ですか?

4

4 に答える 4

0

awk は行ごとに機能するため、式は行ごとに 1 回だけ一致します。awk でそれを行うには、match関数をループで使用できます。また、式が魔法のように最初の ] で止まらないため、正規表現を変更して貪欲にならないようにする必要があります。

grep を使用する方が簡単かもしれません:

echo  "[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]" | grep -o '\[ONE[^]]*\]'
于 2013-02-06T00:32:50.460 に答える
0

このようなものを試すことができます

sed -re 's/(\[ONE[^\[]*\])/\n\1\n/g' temp.txt

入力

[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]

出力

[ONE testing 1 2 3]
 [TWO lorem ipsum] 
[ONE 123]

TWO で列を削除する場合は、

sed -re 's/(\[ONE[^\[]*\])()/\n\1\n/g; s/(\[[^ONE][^\[]*\])//g' temp.txt

出力

[ONE testing 1 2 3]

[ONE 123]
于 2013-02-06T01:12:19.720 に答える
0

これがより大きなものの一部である場合:

BEGIN { 
# Change the field-separator, from default blank, to the end-marker 
# for each "field"
    FS = "] "
}
# Get rid of lines which can't possibly match
!/\[ONE/ { next
    }
{
# Test and report each of three fields for starting with [ONE,
# "closing" the field with FS, except for the last which will 
# already be "closed"
if ( $1 ~ /^\[ONE/ ) {
    print $1 FS
    }
if ( $2 ~ /^\[ONE/ ) {
    print $2 FS
    }
if ( $3 ~ /^\[ONE/ ) {
    print $3
    }
}

「if」はループ内の 1 つに置き換えることができますが、FS (フィールド区切り文字) は必要ないため (データに末尾の空白がない限り)、最後のものに注意してください。

于 2013-02-06T01:16:13.257 に答える
0

「awk」はデフォルトで「単一スペース」を区切り文字として取り、「print $1」コマンドはデフォルトの区切り文字で区切られた最初の値を取得しようとします。

これを試してください:

3 行を含む「test.txt」という名前のテキスト ファイルがあるとします。

猫のテスト.txt

[1 つのテスト 1 2 3]

[TWO lorem ipsum]

【ワン123】

grep -h '[ONE*' test.txt

[1 つのテスト 1 2 3]

【ワン123】

于 2013-02-07T05:50:50.757 に答える