我有一个包含国家/地区名称的文件,然后是该国家/地区的移动国家/地区代码前缀,如下所示:
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
函数。 -lne
options 用于运行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