繁体   English   中英

反向列使用sed

[英]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.

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