Bash 打印行,然后打印最后一个单词两次
我有以下文件(F1): 我希望输出为: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命令。正则表达式特殊值在字符类中失去其特殊意义。因此,[|$]匹配单个字符,可以是空格、管道或美
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