繁体   English   中英

sed / grep / awk? :将匹配模式附加到行尾

[英]sed / grep / awk? : append matching pattern to end of line

我有一个文件,如

1,ab012a800,20141205
2,ab023a801,20141205
3,ab012a802,20141205
1,ab024a803,20141205
1,ab012a804,20141205

我想提取'ab012a'部分并将其附加到行尾。

1,ab012a800,20141205,ab012a
2,ab023a801,20141205,ab023a
3,ab012a802,20141205,ab012a
1,ab024a803,20141205,ab024a
1,ab012a804,20141205,ab012a

我可以用grep提取:

grep -o '^[a-z][a-z][0-9]*[a-z]' file    

并附加到sed的一行:

sed "s/$/,whatever/"

甚至用sed替换模式:

sed '/^[a-z][a-z][0-9]*[a-z]/ s/$/something/' file

但是我如何将匹配模式附加到行尾?

非常感谢

您可以使用:

sed -i.bak 's/\(,[a-z][a-z][0-9]*[a-z]\).*$/&\1/' file
1,ab012a800,20141205,ab012a
2,ab023a801,20141205,ab023a
3,ab012a802,20141205,ab012a
1,ab024a803,20141205,ab024a
1,ab012a804,20141205,ab012a

&是替换中的特殊符号,表示使用正则表达式的完全匹配的字符串, \\1表示匹配的组#1。

GAWK方式

awk 'match($0,/[a-z][a-z][0-9]+[a-z]/,a){print $0","a[0]}' file

匹配字符串然后打印行和匹配的字符串

替代便携式awk方式(由EdMorton提供)

awk 'match($0,/[a-z][a-z][0-9]+[a-z]/{$0=$0","substr($0,RSTART,RLENGTH)}1' file

并具有最大可移植性的字符类

awk 'match($0,/[[:lower:]][[:lower:]][[:digit:]]+[[:lower:]]/{
     $0=$0","substr($0,RSTART,RLENGTH)}1' file

你可以使用这个GNU awk

awk -F"," '{print $1","$2","$3"," gensub(/(.*)(...$)/, "\\1", "g", $2)}' FileName

输出:

1,ab012a800,20141205,ab012a
2,ab023a801,20141205,ab023a
3,ab012a802,20141205,ab012a
1,ab024a803,20141205,ab024a
1,ab012a804,20141205,ab012a

使用捕获组:

$ sed -r 's@^([0-9]+,)(ab[0-9]+[a-z]+)(.*)@\1\2\3,\2@g' file
1,ab012a800,20141205,ab012a
2,ab023a801,20141205,ab023a
3,ab012a802,20141205,ab012a
1,ab024a803,20141205,ab024a
1,ab012a804,20141205,ab012a
sed 's/.\(.\{7\}\).*/&\1/' YourFile

没有任何其他约束,并基于此示例...

perl -pe 's/(.{7})(.*)/$1$2,$1/' file
awk '{print $1"," substr($0,3,6)}' file

1,ab012a800,20141205,ab012a
2,ab023a801,20141205,ab023a
3,ab012a802,20141205,ab012a
1,ab024a803,20141205,ab024a
1,ab012a804,20141205,ab012a

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM