如何列印文件中的前兩個欄位?

如何列印文件中的前兩個欄位?

我有一個包含國家/地區名稱的文件,然後是該國家/地區的移動國家/地區代碼前綴,如下所示:

United Kingdom   +44  ...more fields
United States Virgin Islands +1  ...more fields

我需要取得國家/地區名稱和手機前綴。因此,正規表示式的讀法如下:從行首讀取所有單詞,然後讀取以加號和多一位數字開頭的字串,然後停止。

我用 grep、cut 甚至 sed 嘗試了一些東西,但我無法得到它。

答案1

嘗試:

grep -o '^[^+]*+[0-9]\+' infile

[^+]*+匹配所有內容,直到第一次+找到後面跟一個或多個數字[0-9]\+

答案2

命令列:

$ perl -lne 'print /^(.*?\+\d+)/' input.txt

這將從輸入中獲取所需的資訊。

在職的:

  • /^(.*?\+\d+)/正規表示式應提取所有內容,直到第一次出現加號,後面跟著至少一個數字符號。
  • BOL由於這是透過插入符號連接到的^,因此顯然只能發生一次匹配。
  • 匹配被傳遞給print函數。
  • -lneoptions 用於執行input.file 每一行的選項Perl中給出的程式碼。除非特別要求,否則 perl 不會列印任何內容。-e-n

輸出:

United Kingdom   +44
United States Virgin Islands +1

答案3

自從你說 空間是文件中使用的分隔符,您應該能夠使用

cut -d ' ' -f 1-5 filename

從文件中提取前五列。

對於給定的數據,這會產生

United Kingdom   +44
United States Virgin Islands +1

……但我假設這只是運氣,因為一個名稱包含兩個以上單字的國家將跨越多個領域(而不僅僅是兩個)。

一種更可靠的方法,用於sed刪除每行第一組數字之後的所有內容(即國家代碼之後的所有內容):

sed 's/\([[:digit:]][[:digit:]]*\).*/\1/' filename

或者,

sed 's/\([[:digit:]]\{1,\}\).*/\1/' filename

或者,使用-E擴展正則表達式代替,

sed -E 's/([[:digit:]]+).*/\1/' filename

相關內容