有人可以为我打破这个sed命令吗?

时间:2016-09-29 19:26:41

标签: sed

我在unix论坛上发现了这个神奇的命令,将文件的最后一行移动到文件的开头。我使用sed相当多但不是这个程度。有人可以向我解释每个部分吗?

sed '1h;1d;$!H;$!d;G' infile

2 个答案:

答案 0 :(得分:1)

是的,它使用了奇特的命令。

  • 1h:将第一行放在“hold”空间中(sed有2个空格:1个保留空间以保存数据和模式空间:实际处理的行)
  • 1d:删除第一行
  • $!H:追加所有行但是最后一行(以及d命令跳到下一行后的第一行)到“保留”空间
  • $!d:删除(不打印)除最后一行之外的所有行
  • G:在模式空间的内容中添加换行符(这是最后一行,唯一能够到达脚本部分的行),然后将保留空间的内容追加到模式空间的内容中,图案空间立即打印。交换完毕。

基于意见的评论:我必须承认我永远不会想到使用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在保留空间后附加换行符,然后将图案空间附加到保留空间。
  • GH类似,但在另一个方向;它将保留空间复制到模式空间。

对具有N行的文件的整体影响是在保留空间中构建第1行到第N-1行的副本。当图案保持线N时,将保持空间附加到图案空间并将图案空间打印到标准输出。