用分号解释bash SED命令

用分号解释bash SED命令,sed,Sed,这个sed命令在做什么?有没有像regex这样的在线工具 sed -i '1s/$/|,a Type,b Type,c Type/;/./!b;1!s/$/|,,,/' textflile.txt 我认为在开始时,它会在行尾添加csv a类型、b类型、c类型,但命令的其余部分也会做什么呢?我不知道有任何这样的实用程序,但让我使用文本编辑器解释一下: sed -i '1s/$/|,a Type,b Type,c Type/;/./!b;1!s/$/|,,,/' textflile.txt

这个sed命令在做什么?有没有像regex这样的在线工具

sed -i '1s/$/|,a Type,b Type,c Type/;/./!b;1!s/$/|,,,/' textflile.txt

我认为在开始时,它会在行尾添加csv a类型、b类型、c类型,但命令的其余部分也会做什么呢?

我不知道有任何这样的实用程序,但让我使用文本编辑器解释一下:

sed -i '1s/$/|,a Type,b Type,c Type/;/./!b;1!s/$/|,,,/' textflile.txt
    ^   ^  ^                          ^ ^^ ^^                       ^
    |   |  |                          | || ||                       |
modify  |  End                Non-empty || ||                       input
the     |  of                 lines     || |Negation,               file
file    |  line               only      || |i.e. lines 2,3,...
in      |                               || |
place   |                               || First
     First line            Negation, i.e.| line
                         empty lines only|
                                         Branch to
                                         script end,
                                         i.e. skip the rest
换句话说,它将
|,a类型,b类型,c类型
添加到第一行,不更改空行,并将
|,,,
添加到所有剩余行

sed -i '1s/$/|,a Type,b Type,c Type/;/./!b;1!s/$/|,,,/' textflile.txt
可以写成

sed -i '
    1 s/$/|,a Type,b Type,c Type/
    /./! b
    1! s/$/|,,,/
' textflile.txt
  • 仅在第1行的末尾添加一些文本
  • 如果行为空(“匹配1个字符,不匹配”),则转到下一个“循环”(即打印当前行并转到下一行)
  • 在除第1行以外的每一行上,在该行末尾添加“|,,”
  • 因此,看起来您正在向CSV文件添加一些空白字段


    info sed
    包含完整的sed手册。

    这并不能回答您的问题,但重要的是让人们知道,它需要比注释更多的空间和格式,因此:仅供参考,以执行sed脚本的功能,即

    it adds |,a type, b Type,c Type to the first line,
    doesn't change empty lines,
    and adds |,,, to all the remaining lines.
    
    在awk中就是这样:

    awk '
        NR==1 { print $0 "|,a type, b Type,c Type"; next }
        !NF   { print }
        NF    { print $0 "|,,," }
    '
    
    或者,如果您熟悉三元表达式并希望删除冗余代码:

    awk '{
        sfx = "|," (NR==1 ? "a type, b Type,c Type" : ",,")
        print $0 (NF ? sfx : "")
    }'
    

    这就是为什么我总是说,
    sed代表s/old/new,仅此而已。使用sed做任何其他事情,你都会得到这样一个神秘的咒语,通常一个月后,甚至作者都无法理解,当需求发生变化时,也没有人能够建立在这个咒语之上。发布一些示例输入和运行该脚本后得到的输出,我希望有人能向您展示如何使用清晰、简单、可移植、高效的awk脚本执行相同的操作。也许会有帮助。但那到底有什么作用?@埃德默顿:更新。哇。这么简单的任务需要这么复杂的脚本。谢谢