我在unix论坛上发现了这个神奇的命令,将文件的最后一行移动到文件的开头。我使用sed相当多但不是这个程度。有人可以向我解释每个部分吗?
sed '1h;1d;$!H;$!d;G' infile
答案 0 :(得分:1)
是的,它使用了奇特的命令。
基于意见的评论:我必须承认我永远不会想到使用sed
做到这一点,我将不得不做一个测试来说服我这个命令在做什么......在awk
中,这样做要容易得多。
但是sed
在我心中有一个特殊的地方,它有着神秘的命令。我想知道CodeGolf是否有一些sed
候选人:)
答案 1 :(得分:0)
这是一个更具程序性的伪代码中的相同命令:
for line in infile:
# Always do this: Copy the current line to the pattern
pattern = line
# Process the script
if first line:
hold = pattern # 1h
pattern = ""; continue # 1d
elif not last line:
hold = hold + "\n" + pattern # $!H
pattern = ""; continue # $!d
pattern = pattern + "\n" + hold # G
# Always do this after the script is completed.
# Due to the continue statements above, this
# isn't always reached, and in this case
# is only reached for the last line.
print pattern
d
清除模式空间并继续执行下一个输入行,而不执行其余的脚本。
h
将模式空间复制到保留空间。
H
在保留空间后附加换行符,然后将图案空间附加到保留空间。G
与H
类似,但在另一个方向;它将保留空间复制到模式空间。对具有N行的文件的整体影响是在保留空间中构建第1行到第N-1行的副本。当图案保持线N时,将保持空间附加到图案空间并将图案空间打印到标准输出。