[英]Reverse columns in using sed
如果我有这样的文件:
aa:bb:cc
dd:ee:ff
我想将列反转为:
cc bb aa
ff ee dd
基本上将列反转,然后将“:”替换为“”
在担心“:”替换之前,我一直试图降低价格。 我试图为此仅使用sed。
sed -r 's/(:.*)(.*:)/\2\1/'
理想情况下,这应该匹配第一个“:”之前的所有内容,然后匹配最后一个“:”之后的所有内容,然后以相反的顺序打印它们,但事实并非如此。
任何帮助都很好,我觉得我很亲密,但这里缺少一些东西。
如果您坚持使用sed:
sed -r ':a;/[^:]*:[^:]*:/{s/([^:]*):([^:]*):(.*)/\2 \1:\3/;ba};/[^:]*:[^:]*$/s/([^:]*):([^:]*)$/\2 \1/;' file
那里的小循环。
但是使用awk更好:
awk -F: '{for(i=NF;i>1;i--)printf("%s ",$i);print $1}' file
printf不会返回(加\\ n),打印会返回。
awk确实是一个更好的工具,但是如果将自己限制为3列,则使用sed的合理方法是:
$ k='\([^:]*\)'
$ sed "s/$k:$k:$k/\3 \2 \1/" input
这可能对您有用(GNU sed):
sed -r 's/$/:\n/;ta;:a;s/^([^ :]+)\s*:(.*\n)/\2 \1/;ta;s/\n //' file
此附加一新行和另一个分隔符( :
)到行的结尾。 然后将第一列移到换行符之后,并添加一个新的定界符( )。 重复此操作,直到该行的第一个字符是换行符,然后将其与不需要的额外新定界符一起删除。
注意:因为第一次替换将始终成功,所以在第一次替换之后使用ta
命令可以重置真值标志。
您写道:这应该匹配第一个“:”之前的所有内容,然后匹配最后一个“:”之后的所有内容,然后以相反的顺序打印它们。 我认为您想将aa:bb:cc:dd
转换为dd bb cc aa
。 这可以用
sed -e "s/^\([^:]*\):\(.*\):\([^:]*\)$/\3 \2 \1/" -e 's/:/ /g' inputfile
# Test
echo "aa:bb:cc
aa:bb:cc:dd" | sed -e "s/^\([^:]*\):\(.*\):\([^:]*\)$/\3 \2 \1/" -e 's/:/ /g'
# Output
cc bb aa
dd bb cc aa
说明: ^
匹配行首, $
结束行。 [^:]*
匹配不带:
的字符串。 \\(some_match\\)
记住some_match
,它可以用\\1
(1是内存中的第一件事)显示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.