簡體   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