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