gpt4 book ai didi

sed - 交换两行

转载 作者:行者123 更新时间:2023-12-04 01:35:42 27 4
gpt4 key购买 nike

如何使用 sed H , h , x , g , G等命令交换两行?

例如在文件中

START
this is a dog
this is a cat
this is something else
END

说我想把“这是一只狗”换成“这是别的东西”。

这是我到目前为止:
/this is a dog/{
h # put to hold space
}
/this is something else/{
# now i am stuck on what to do.
}

最佳答案

如果您知道要交换的两行中的每一行的模式,但不知道这些行的全部内容,则可以执行以下操作:

sed -n '                     # turn off default printing
/dog/{ # if the line matches "dog"
h # put it in hold space
:a # label "a" - the top of a loop
n # fetch the next line
/something/{ # if it matches "something"
p # print it
x # swap hold and pattern space
bb # branch out of the loop to label "b"
} # done with "something"
# if we're here, the line doesn't match "something"
H # append pattern space to hold space
x # swap hold and pattern space
s/\([^\n]*\)\n\([^\n]*\)$/\2\n\1/ # see below
x # swap hold and pattern space
ba # branch to the top of the loop to label "a"
} # done with "dog"
:b # label "b" - outside the loop
# print lines that don't match and are outside the pair
p # also prints what had been accumulating in hold space
' inputfile

替换模式在累积行的末尾保留“狗”。它不断交换我们保留在保持空间中的最后两行,以便“狗”“冒泡”到底部。

例如,让我们在“cat”行之后再添加一行,这样过程会更清晰一些。我们将忽略“dog”之前和“something”之后的行。我将继续使用我的昵称来引用这些行
this is a dog
this is a cat
there's a bear here, too
this is something else

读取“狗”,然后获取“猫”。完成了一些附加和交换。现在模式空间看起来像这样( \N 代表换行符,我使用大写字母“N”所以它很突出, ^ 是模式空间的开始, $ 是结束):
^this is a dog\Nthis is a cat$

替换命令查找任意数量的不是换行符的字符(并捕获它们),然后是换行符,然后是任意数量的非换行符(并捕获它们),它们位于行尾 ($) 并替换所有这一切都以相反的顺序捕获的两个字符串由换行符分隔。现在模式空间看起来像这样:
^this is a cat\Nthis is a dog$

现在我们交换并读取一个新行。它不是“东西”,所以我们做了一些附加和交换,现在我们有:
^this is a cat\Nthis is a dog\Nthere's a bear here, too$

我们再次进行替换并得到:
^this is a cat\Nthere's a bear here, too\Nthis is a dog$

为什么我们没有得到“bear/dog/cat”呢?因为由两行组成的正则表达式模式(像往常一样,每行由非换行符和换行符组成)使用 $ anchor 定在行尾。所以我们忽略了它之前的任何东西。请注意,最后一个换行符是隐含的,实际上并不存在于模式或保持空间中。这就是为什么我不在这里展示它。

现在我们读取“某物”并打印它。我们交换。嘿!有些东西我们一直在“冒泡”。分支并打印。由于“dog”位于行的底部(已累积在保持空间中)并且我们在该行之前打印了“something”,因此我们交换了两行。

无论要交换的两行之前、之间或之后出现多少行,此脚本都将起作用。事实上,如果有多对匹配的行,每对的成员将在整个文件中交换。

如您所见,我只键入感兴趣的行中的一个单词,但任何合适的正则表达式都可以。

关于sed - 交换两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4331851/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com