Bash 打印行,然后打印最后一个单词两次

Bash 打印行,然后打印最后一个单词两次,bash,sed,Bash,Sed,我有以下文件(F1): 我希望输出为: if a equals b b b you you you three aggbc four four four 我运行以下命令: sed -re 's/.*([^ ]+)[ |$]/\0 \1 \1/' F1 但它不起作用 我得到的输出是错误的: if a equals s sb you three aggbc c cfour 我需要它作为一个sed命令。正则表达式特殊值在字符类中失去其特殊意义。因此,[|$]匹配单个字符,可以是空格、管道或美

我有以下文件(F1):

我希望输出为:

if a equals b b b
you you you
three aggbc four four four
我运行以下命令:

sed -re 's/.*([^ ]+)[ |$]/\0 \1 \1/' F1
但它不起作用

我得到的输出是错误的:

if a equals  s sb
you
three aggbc  c cfour

我需要它作为一个
sed
命令。

正则表达式特殊值在字符类中失去其特殊意义。因此,
[|$]
匹配单个字符,可以是空格、管道或美元符号。试试这个

sed -r 's/^(.* )?(.*)$/\1\2 \2 \2/' F1
sed -re 's/.*([^ ]+) *$/& \1 \1/' F1

还请注意,我将
\0
更改为
&
。我没有在
sed
中看到
\0
,但是如果您的支持,您将获得更多的功能。

如果您对学习awk感兴趣,请看以下内容:

awk '{print $0 FS $NF FS $NF}' file

awk '{$NF=$NF FS $NF FS $NF}1' file 

但它不起作用。
它做了什么?它用我得到的输出更新了帖子。使用
awk
会非常快:
awk'{print$0,$NF,$NF}'文件
我需要它在'sed'中不幸的是……对于只有
you
字符串的行,它不起作用,因为初始的
*
是贪婪的。它将匹配到最后,并将开始回溯到匹配,因此它将只重复最后一个字母,而不是整个单词。谢谢注意。我对@JoyRe的答案投了赞成票,但请留下解释。但你可以修正它。在对最后一个单词进行分组并在替换部分中使用
\2
之前,您可以使其回溯到空格或开始添加
([]|^)
,如:
sed-re's/*([]|^)([^]+)*$/&\2\2/'infle
,再次感谢。我还是太懒了
awk '{print $0 FS $NF FS $NF}' file

awk '{$NF=$NF FS $NF FS $NF}1' file