删除两个字符串之间的任何回车符/换行符

Remove any returns/newlines between two strings

提问人:Adam James Dietrick 提问时间:11/11/2023 更新时间:11/12/2023 访问量:72

问:

我正在执行放映时间脚本的最后一步,该脚本提取了我当地的剧院信息并将其转换为干净的文本格式。我添加了一些“标志”,我想删除开头和结尾标志之间可能存在的任何返回,并且很可能将它们替换为空格。

电流输出:

|startStart| Sat Nov 11, 1:00 4:10 |endEnd|
|startStart| Sun Nov 12, 1:00 4:10 |endEnd|
|startStart| Mon Nov 13, 5:50 |endEnd|
|startStart| Tue Nov 14, 5:50 |endEnd|
|startStart| Wed
Nov 15, 5:50 |endEnd|

我不确定如何进行。我使用谷歌找不到类似的问题。如果可能的话,我想使用 SED,因为这是脚本其余部分中使用的,也是我目前正在学习的程序。

我希望输出如下所示:

|startStart| Sat Nov 11, 1:00 4:10 |endEnd|
|startStart| Sun Nov 12, 1:00 4:10 |endEnd|
|startStart| Mon Nov 13, 5:50 |endEnd|
|startStart| Tue Nov 14, 5:50 |endEnd|
|startStart| Wed Nov 15, 5:50 |endEnd|

Linux 文本 SED

评论

0赞 Barmar 11/11/2023
您可以使用保留空间来执行此操作,但在其他语言中会更容易,例如 .awk
0赞 Adam James Dietrick 11/11/2023
你能提供awk的例子吗?
0赞 Barmar 11/11/2023
不,我不会为你写,但我会解释其中的逻辑。测试当前行是否以 结尾。如果没有,请将当前行保存在变量中。如果是这样,请将当前行与变量连接起来,打印该结果,然后清空变量。|endEnd|
0赞 HatLess 11/11/2023
你能分享一下你到目前为止尝试过什么吗?
0赞 Adam James Dietrick 11/11/2023
谢谢@barmar。所以我认为这将对我有足够的帮助,让我在纸上得到一些东西。这个逻辑对你来说听起来正确吗?找到以 |startStart| 开头的行,检查它是否以 |endEnd| 结尾。如果没有,请将其写入变量并删除原始行。找到以下以 |endEnd| 结尾的行并将变量附加到它的前面。或者是否可以在|startStart|线?

答:

2赞 jhnc 11/11/2023 #1

如果总是后面跟着 ,那么这应该有效:|startStart||endEnd|

sed '
    /|startStart|/ {
        :a
        /|endEnd|/! {
            N
            ba
        }
        s/\n/ /g
    }
' inputfile >outputfile
  • 当看到包含开始标记的行时:
    • 直到看到包含结束标记的行
      • 将下一行追加到模式空间
    • 删除任何换行符
0赞 potong 11/11/2023 #2

这可能对你有用(GNU sed):

sed ':a;/|endEnd|$/!{N;s/\n/ /;ba}' file

设置一个名为 的 goto 点。a

如果一行不以 结尾,则附加下一行并用空格替换它们之间的换行符。|endEnd|

转到a

注意如果没有下一行,该命令将终止处理,因此如果数据不完整,将输出错误记录。N

1赞 Walter A 11/12/2023 #3

当每行都应该有一个 时,将 all 替换为空格,并在每个 .|startStart|...|endEnd|\n|endEnd|

tr '\n' ' ' < file | sed -r 's/\|endEnd\| /&\n/g'

或者有选项-z

sed -rz 's/\n/ /g;s/\|endEnd\| /&\n/g' file

编辑:
进行上述更改后,每行都将以空格结尾。不要使用 :
&

sed -rz 's/\n/ /g;s/(\|endEnd\|) /\1\n/g' file