【问题标题】:How to add line to beginning of sed output如何在 sed 输出的开头添加行
【发布时间】:2015-10-05 11:30:18
【问题描述】:

所以我遇到的问题是我正在使用 sed 从 bash 脚本中的字符串中提取一堆对象,但我需要将相同的字符串添加到 sed 输出的开头。一个例子:

数据:

|field1|field2|select * from object1, object2|

sed 输出:

object1|
object2|

我尝试过的:

将整行粘贴到一个名为LINE的变量中,然后:

sed "s/^.*/$LINE&/g"

这导致错误提示:

s 的未知选项

echo $LINE
|field1|field2|select * from object1, object2|

所以变量没有问题。

这是所需的输出:

|field1|field2|select * from object1, object2|object1|

|field1|field2|select * from object1, object2|object2|

真诚感谢任何帮助:)

-瑞恩

【问题讨论】:

  • line='|field1|field2|select * from object1, object2|'; sed "s/^.*/$line&/g" <<< $'object1|\nobject2|' 在这里按预期工作。
  • 是的,它可以从命令行工作。不是来自 bash 脚本...
  • 然后显示你的脚本!
  • echo $LINE 是错误的。您需要echo "$LINE" 来显示变量LINE 的内容。如所写,LINE 可能包含多个换行符,而您永远不会知道它(当然,sed 命令失败除外 :-))。您的代码中有几个基本的 shell 编程错误 - 我建议您阅读 Chris Johnson 的《Shell Scripting Recipes》一书。
  • Ed,虽然我很欣赏你花时间回复这个事实,但我不欣赏你的回复本身。我使用了echo $LINE,因为没有换行符。此外,您所说的我的“代码”包含上面示例中的所有两行,因此我看不到您所说的“几个基本的 shell 编程错误”。当你心情不好并且想对某人抱怨时,不要在这里这样做。

标签: linux string bash sed


【解决方案1】:

您的字符串中的某些字符正在被 sed 解释。为避免此问题,您应该使用基于字符串的方法,而不是基于正则表达式的方法。例如,使用 awk:

awk -v line="$line" '{ print line $0 }' file

这会将 shell 变量 $line 中的字符串添加到 file 中每一行的开头。

【讨论】:

  • ...实际上,在您展示的情况下,该字符串看起来可以安全使用,但我还是推荐这种方法。
  • 我爱你...像魅力一样工作
  • 这是个好建议!不过,请注意awk 可能会因反斜杠而窒息……
  • @gniourf_gniourf 的意思是 awk can choke on backslashes 是因为 awk 是一种文本处理工具,并且在文本中查找正则表达式时几乎总是期望的行为是将正则表达式中的 \t 扩展为一个文字选项卡,以便它在输入文件中找到那些,这正是 awk 默认所做的。在极少数情况下,如果这不是所需的行为,那么您只需要双重转义 (\\t) 或使用不同的方法将值传递给 awk(例如,通过 ENVIRON[] 或作为参数 awk '<script>' '\t' file)。重要的是 - 这是可取的,不是问题!
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 2014-11-05
  • 2022-07-06
  • 2011-04-15
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多