如何打印文件中的前两个字段?

如何打印文件中的前两个字段?

我有一个包含国家/地区名称的文件,然后是该国家/地区的移动国家/地区代码前缀,如下所示:

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

相关内容