我有一个名称.txt 文件,其中每一行的形式如下:
xxxxxx random_string_of_characters 2015
其中 xxxxxx 是一个 6 位数字,random_string_of_characters 可以是任何事物。我想使用替换命令替换每行中 xxxxxx 和 2015 之间的所有空白和 random_string_of_characters,以便每个字符串看起来像这样:
xxxxxx 2015
那么,实现这一目标的最佳方法是什么?
答案1
你可以做
sed -i -e 's/[[:space:]]\+.\+2015$/ 2015/' names.txt
如果你想将它保存到同一个文件中。-i
如果您只想打印到标准输出,请删除,您可以将其重定向到另一个文件。
它将匹配行尾任意数量的空格,后跟 2015 之前的任何内容,然后将整个匹配项替换为“2015”
另一种可能性是做
sed -e 's/^\([[:digit:]]\{6\}\).\+\([[:digit:]]\{4\}\)$/\1 \2/' names.txt
它将匹配行首的 6 个数字和行尾的 4 个数字,并打印这些匹配项,并在它们之间留一个空格。它将保持任何其他行不变。
答案2
我的偏好是锚定到字符串的开头以减少回溯,我喜欢扩展的正则表达式,所以我会使用
sed -re 's/^([0-9]{6}) .*( 2015)$/\1\2/' names.txt
这是做什么的
-r extended regexp
-e expression to follow
s substitute
^ beginning of line
( start subpattern
[0-9] a digit
{6} previous occurs exactly six times
) end subexpression
. any single character
* previous occurs zero or more times
$ end of line
\1 first subpattern
\2 second subpattern