【问题标题】:sed script delete line before if blank linesed 脚本删除空行之前的行
【发布时间】:2020-11-04 07:06:34
【问题描述】:

我有一个如下所示的文件:

name:height:weight

janice:120:209
mark:150:349
ray:90:204
elle:140:129

----------

我想编写一个 sed 脚本,在文件的开头 + 结尾以及每个人输入之前和之后添加一行包含 ~ 的行,如下所示:

~
name:height:weight

~
janice:120:209
~
mark:150:349
~
ray:90:204
~
elle:140:129
~

----------
~

我当前的脚本和输出看起来像这样,但我不知道如何在每个人的条目之间添加“~”:

1i ~
$a ~
~
name:height:weight

janice:120:209
mark:150:349
ray:90:204
elle:140:129

----------
~

【问题讨论】:

  • 所以...您想在文件末尾和每个非空行之前添加包含~ 的行,除非该行与-------- 完全匹配?不要只是给出样本所需的输出,而是尝试描述你正在尝试做的事情。
  • @WilliamPursell 对不起,我编辑了我的问题!
  • sed 是在单行上执行 s/old/new/ 的最佳工具。这不是你想要做的,所以你不应该尝试使用 sed 因为有更适合的工具,例如awk。

标签: regex linux sed


【解决方案1】:

这与您的输出不完全匹配,但它确实符合我在评论中描述的内容并且您确认是您想要的:

awk '/./ && !/^---/{print "~"}1; END{print "~"}' input

根据实际需要进行调整。

【讨论】:

  • 感谢您的回复!我想知道如何使用 sed 脚本而不是 awk 来做到这一点
  • @j.doe sed 构造来做这样的事情将是不可移植的、低效的、神秘的,并且在 40 多年前 awk 被发明时就已经过时了。
【解决方案2】:

可能是所有这些中最短的答案:

Sed 脚本:

i ~
/^name:height:weight$\|^$/N
$a ~

解释:

  • 第 1 行:在每行之前插入 ~
  • 第 2 行:如果我们点击标题或-------- 之前的空行 我们跳过下一个~
  • 第 3 行:将 ~ 附加到流的末尾

让我们保存script.sed,然后测试一下:

> sed -f script.sed test.txt
~
name:height:weight

~
janice:120:209
~
mark:150:349
~
ray:90:204
~
elle:140:129
~

----------
~

经过测试

> sed --version
sed (GNU sed) 4.2.2
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jay Fenlason, Tom Lord, Ken Pizzini,
and Paolo Bonzini.
GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-sed@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

【讨论】:

  • 感谢您的回复!输出接近我正在寻找的,并且。 (来自此命令的输出)我想知道如何删除 'name:height:weight' 行下的 '~' 并在 'janice:120:209' 行上方添加 '~'
  • 查看更新。这个版本漏掉了最后一个~,不过我想应该很容易添加吧。
  • 对于新版本,我想知道如何在 'elle' 行下添加一个 '~' 并删除 '----' 行之前的 '~'
  • 我希望在每个人输入之前和之后添加一个'〜',并在脚本的开头和结尾添加一个'〜'
  • 您应该提及这些脚本需要哪个 sed 版本,因为它们不适用于 POSIX sed。
【解决方案3】:

这将在每个 UNIX 机器上的任何 shell 中使用任何 awk 来工作:

$ cat tst.awk
BEGIN { RS="" }
NR == 1 { print "~\n" $0 "\n"; next }
/^-+$/  { print $0 "\n~"; next }
{
    gsub(/\n/,"\n~\n")
    print "~\n" $0 "\n~\n"
}

.

$ awk -f tst.awk file
~
name:height:weight

~
janice:120:209
~
mark:150:349
~
ray:90:204
~
elle:140:129
~

----------
~

【讨论】:

    【解决方案4】:

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

    sed -zE 's/.*/~\n&/mg;s/~\n//2;s/(.*)~\n(.*~)/\1\2/' file
    

    ~\n 放在所有非空行的上方和下方,然后从最后出现的~\n 中删除第二个和第二个。

    替代方案:

    sed -e '1i~' -e '1b;N;/^\n$/!a~' -e 'P;D' file
    

    【讨论】:

      猜你喜欢
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 2020-04-02
      • 2015-05-20
      • 2013-09-23
      • 2013-05-01
      相关资源
      最近更新 更多