如果我有这样的文件:
aa:bb:cc
dd:ee:ff
我想将列反转为:
cc bb aa
ff ee dd
基本上反转列并替换":"用" "
我一直在努力让人们放心,然后再担心":"替换。我试图只使用sed。
sed -r 's/(:.*)(.*:)/\2\1/'
理想情况下,这应该匹配第一个":"然后匹配最后一个"之后的所有内容:"然后以相反的顺序打印它们,但事实并非如此。
任何帮助都会很好,我觉得我很接近但只是在这里遗漏了一些东西。
答案 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是记忆中的第一件事)。