使用sed反转列

时间:2016-01-31 02:49:52

标签: regex linux unix sed

如果我有这样的文件:

aa:bb:cc  
dd:ee:ff

我想将列反转为:

cc bb aa  
ff ee dd

基本上反转列并替换":"用" "

我一直在努力让人们放心,然后再担心":"替换。我试图只使用sed。

sed -r 's/(:.*)(.*:)/\2\1/'

理想情况下,这应该匹配第一个":"然后匹配最后一个"之后的所有内容:"然后以相反的顺序打印它们,但事实并非如此。

任何帮助都会很好,我觉得我很接近但只是在这里遗漏了一些东西。

4 个答案:

答案 0 :(得分:2)

如果你坚持使用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),打印会。

答案 1 :(得分:1)

awk确实是更好的工具,但是如果你将自己限制在3列,使用sed的合理方法是:

for

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -r 's/$/:\n/;ta;:a;s/^([^ :]+)\s*:(.*\n)/\2 \1/;ta;s/\n //' file

这会在行尾添加换行符和另一个分隔符(:)。然后将第一列移动到换行符之后,并为其添加新的分隔符()。重复此过程,直到该行的第一个字符是换行符,然后将其与不需要的额外新分隔符一起删除。

N.B。第一次替换后的ta命令用于重置真值标志,因为第一次替换将始终成功。

答案 3 :(得分:0)

您写道:这应该匹配第一个“:”之后的所有内容,然后匹配最后一个“:”之后的所有内容,然后以相反的顺序打印它们。我想您希望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可以显示[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") $form = New-Object System.Windows.Forms.Form $form.Size = New-Object System.Drawing.Size(400,400) $Array = New-Object System.Collections.ArrayList $Array.add('AAA') $Array.add('BBB') $Array.add('CCC') $Array.add('DDD') foreach ($item in $Array) { New-Variable -Force -Name "button$membershipCount" -Value (New-Object System.Windows.Forms.Button) $thisButton = Get-Variable -ValueOnly -Include "button$membershipCount" $thisButton.Location = New-Object System.Drawing.Size(175,(35+26*$membershipCount)) $thisButton.Size = New-Object System.Drawing.Size(250,23) $thisButton.Text = $item $thisButton.Add_Click({(Write-Host $thisButton.Text | Out-Null)}) $form.Controls.Add($CHANGEButton) } (1是记忆中的第一件事)。