如何用sed打印特定图案

问题描述 投票:0回答:3

需要复制机器模式中的最后一个单词

hi abd 123
hiabd 2 44
hi 12 233

输出应该是:

hi abd 123 123 123
hiabd 2 44 44 44

这是我试过的:

sed  '/abd/!d' F1

但它并没有重复最后一个字。我知道我可以用回溯做一些事情,但它被误解了,请帮助我只能使用sed命令。

sed
3个回答
0
投票

使用GNU sed:

sed -n '/abd/ {s/\( [^ ]\+\)$/&\1\1/p}' file

要么

sed -nE '/abd/{ s/( [^ ]+)$/&\1\1/p}' file

输出:

hi abd 123 123 123
hiabd 2 44 44 44

见:Back-references and Subexpressions


1
投票

如果您需要awk解决方案,以下也可以帮助您。

awk '/abd/{print $0,$NF,$NF}'  Input_file

输出如下。

hi abd 123 123 123
hiabd 2 44 44 44

0
投票

对于品种,仅使用bash

while IFS= read -r line; do 
    [[ $line =~ abd ]] && echo "$line ${line##* } ${line##* }"
done < file

您可以选择不同的character set作为单词分隔符,例如:

#space and tab are delimiters
${line##*[[:blank:]]}

#character 'a' and 'c' are delimiters
${line##*[ac]}

此外,您甚至不需要二元运算符=~[[ $line = *abd* ]]就足够了。请注意,使用bash明显慢于awksed解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.