【问题标题】:sed: get a line number with regex and insert text at that linesed:使用正则表达式获取行号并在该行插入文本
【发布时间】:2019-12-10 07:31:34
【问题描述】:

我想获取一个文件的第一行,它没有用哈希注释掉,然后在该行之前添加一行文本就在该行之后

我设法得到了行号:

sed -n '/^\s*#/!{=;q}' file            // prints 2

以及插入文本(手动指定行):

sed '2 a extralinecontent' file

我不能让他们作为一个班轮或一批一起工作。

我尝试了命令替换(使用 $(command) 和反引号),但我从 bash 收到错误:

sed '$(sed -n '/^\s*#/!{=;q}' file) a extralinecontent' file
-bash: !{=: event not found

还尝试了许多其他组合,但没有运气。

我在 macOS 上使用 gnu-sed(通过 brew)。

【问题讨论】:

  • 您能发布您使用$() 尝试过的确切命令吗?我猜你在双引号中使用了它,在这种情况下,! 是特殊的会产生冲突......你可以试试这个:sed $(sed -n '/^\s*#/!{=;q}' file)' a foo' file 其中$() 和其余命令彼此相邻跨度>
  • 我贴出来了,这是最后一个代码块

标签: sed


【解决方案1】:

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

sed -e '/^\s*#/b;a extra line content' -e ':a;n;ba' file

在文件开头删除以注释开头的任何行,在第一行之后附加一个额外的非注释行,并继续获取/打印文件的所有剩余行。

【讨论】:

  • 谢谢,它有效,我修改了我的问题,因为我需要在之前而不是之后插入(我只是感到困惑,我的意思是在最后一个评论行之后)。
【解决方案2】:

这是一种使用GNU sed 的方法,无需两次读取文件

$ cat ip.txt
 #comment
 foo baz good
123 456 7889

$ sed -e '0,/^\s*[^#[:space:]]/ {// a XYZ' -e '}' ip.txt
 #comment
 foo baz good
XYZ
123 456 7889
  • GNU sed 允许第一个地址是 0 如果另一个地址是正则表达式,这样即使第一行匹配条件也可以工作
  • /^\s*[^#[:space:]]/ as sed 不支持所有格量​​词,需要确保与字符类匹配的第一个字符不是# 或空白字符
  • // 是重复上一个正则表达式的便捷快捷方式
  • a XYZ 您需要附加的行(请注意,您的问题提到了insert,所以如果您愿意,请使用i 而不是a

【讨论】:

  • sed: 1: "0,/^\s*[^#[:space:]]/ { ...": 命令 a 需要 \ 后跟文本
  • 你在使用 GNU sed 吗?你得到的错误似乎你不是
  • 你是对的,我昨晚测试了它,但我忘记使用gsed 而不是sed。今晚会试试。我应该删除所有 cmets 吗?
  • 你可以留下它或在检查它是否适合你之后清理它
  • 好的,我试过了。没有错误,但是文本被附加到第一个没有注释的行之后。它应该在最后一个注释之后添加。
猜你喜欢
  • 1970-01-01
  • 2018-07-01
  • 2011-10-02
  • 2016-01-23
  • 2018-04-03
  • 1970-01-01
  • 2019-02-09
  • 2017-08-28
  • 1970-01-01
相关资源
最近更新 更多