この形式のテキストファイルがあります[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]
「[ONE.+]」を1行ずつ出力したい。
出力例は次のようになります。
[ONE testing 1 2 3]
[ONE 123]
試してみましawk '/\[ONE.+\]/ { print $1 }'
たが、うまくいきませんでした。誰か教えてくれませんか?そして、正しい方法は何ですか?
awk は行ごとに機能するため、式は行ごとに 1 回だけ一致します。awk でそれを行うには、match
関数をループで使用できます。また、式が魔法のように最初の ] で止まらないため、正規表現を変更して貪欲にならないようにする必要があります。
grep を使用する方が簡単かもしれません:
echo "[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]" | grep -o '\[ONE[^]]*\]'
このようなものを試すことができます
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]
これがより大きなものの一部である場合:
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 (フィールド区切り文字) は必要ないため (データに末尾の空白がない限り)、最後のものに注意してください。
「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】