
次のような国名とその国のモバイル国コードプレフィックスを含むファイルがあります。
United Kingdom +44 ...more fields
United States Virgin Islands +1 ...more fields
国名とモバイル プレフィックスを取得する必要があります。正規表現は次のようになります。行の先頭からすべての単語を読み取り、プラス記号で始まる文字列とさらに 1 桁の数字を読み取って停止します。
grep、cut、さらには sed を使っていくつか試してみましたが、うまくいきません。
答え1
試してください:
grep -o '^[^+]*+[0-9]\+' infile
[^+]*+
最初に見つかったものまですべてに一致し、+
その後に1つ以上の数字が続く[0-9]\+
答え2
コマンドライン:
$ perl -lne 'print /^(.*?\+\d+)/' input.txt
これにより、入力から必要な情報が取得されます。
働く:
/^(.*?\+\d+)/
正規表現は、プラス記号とそれに続く少なくとも 1 つの数字記号の最初の出現までのすべてを抽出します。BOL
これはキャレット記号を介してに接続されているため^
、明らかに 1 つの一致しか発生しません。- 一致は関数に渡されます
print
。 -lne
オプションは、input.file の各行のオプションPerl
で指定されたコードを実行します。特に要求されない限り、perl は何も印刷しません。-e
-n
出力:
United Kingdom +44
United States Virgin Islands +1
答え3
以来あなたは言う 空間ファイル内で使用されている区切り文字であれば、
cut -d ' ' -f 1-5 filename
ファイルから最初の 5 列を抽出します。
与えられたデータに対して、これは
United Kingdom +44
United States Virgin Islands +1
...しかし、これは単なる幸運だと考えています。国名に 2 つ以上の単語が含まれる国は、複数の分野 (2 つだけではなく) にまたがるからです。
sed
各行の最初の数字セットの後のすべて(つまり、国コードの後のすべてのもの)を削除する、より堅牢な方法:
sed 's/\([[:digit:]][[:digit:]]*\).*/\1/' filename
または、
sed 's/\([[:digit:]]\{1,\}\).*/\1/' filename
または、-E
代わりに拡張正規表現を使用すると、
sed -E 's/([[:digit:]]+).*/\1/' filename