各行の最初の項目だけを印刷する方法は?

各行の最初の項目だけを印刷する方法は?

次のファイルがあります。

asd 123 aaa wrqiqirw 123
123 itiewth 123 asno 123
123 132 123 123 123
boagii 123 asdnojaneoienton 123

予想される出力は次のとおりです。

123
123
123
123

正規表現でパターンを検索する必要があります。このようなことを達成する方法はありますか?

答え1

そして、pcregrep次のようなパターンがあります12*3

pcregrep -o1 '(12*3).*'

使用pcregrepまたはGNU grep -P

grep -Po '^.*?\K12*3'

pcregrep文字よりも多くのバイトで動作しますが、GNU grepは現在のロケールで定義されている文字として機能します(そして入力に現在のロケールの有効なテキストが含まれていることを確認する必要があります))。

grepパターンが空の文字列と一致する場合、GNUは何も印刷しないことに注意してください。

答え2

Perlでは、

perl -lne 'print $& if /\d+/' inputfile

または標準入力から:

echo foo 123 bar 456 doo 789 | perl -lne 'print $& if /\d+/'
123

正規表現は、連続した\d+数値文字列と一致し、$&一致する文字列を引用します。

答え3

1231つのgrepだけで各行に一致を追加するのに十分です。
ゲームが最初、ミッドフィルダー、または最後かどうかは問題ではありません。
123を要求すると、キューに入ると123を受け取ります(質問の表現が正しくないか、他のものが必要な場合を除く)。

$ grep -wo '123' file # -w: word match  -o : return only matched string instead of the whole line (default grep operation)

正規表現を使用して各行の最初の数字(すべての数字 - すべての長さ)を取得する必要がある場合は、次のように操作します。

cat <<EOF >file1
asd 111 777 aaa wrqiqirw 123
333 123 itiewth 123 asno 123
4444 111 123 123 567
boagii what 666 asdnojaneoienton 123
EOF
grep -Po '^[0-9]+|^.*?\K[0-9]+' file1
#output
111
333
4444
666

答え4

sed -e '
   /\n/{P;d;}
   s/12*3/\n&\n/;D
' < inoutfile

関連情報