【问题标题】:Replace 5th and 6th "word" in line of text file with bash variable用 bash 变量替换文本文件中的第 5 和第 6 个“单词”
【发布时间】:2013-09-23 01:57:21
【问题描述】:

这个问题扩展了我的上一个问题 (Search for specific line of text file, replace up to a certain character)。在用户 @anubhava 的帮助下,我能够搜索以 dataspecs 开头的行,并将其转换为

dataspecs v1 v2 v3 v4 v5 ! blah到

dataspecs $new_val ! blah

但是,我现在需要能够保留变量 v1 v2 v3(我不知道它们的实际值),并将 v4 和 v5 替换为 bash 变量 $new_v4和$new_v5。所以我的新行现在看起来像这样:

dataspecs v1 v2 v3 new_v4 new_v5 ! blah

【问题讨论】:

  • 我想我要么需要 sed 来 (1) 告诉 sed 找到 dataspecs 的第一个实例,为该行中的每个单词分配一个数字,然后在“单词”6 和7,或者 (2) 告诉 sed 找到dataspecs 的第一个实例和空白的第四个实例,并将空白和! 之间的所有内容子化。

标签: bash sed awk text-processing


【解决方案1】:
awk -v n4="$new4" -v n5="$new5" '/^dataspecs/{$5=n4;$6=n5}7' file

【讨论】:

  • 谢谢肯特,但我在哪里告诉它只在以dataspecs 开头的行上做潜艇?你能告诉我7 是做什么的吗?
  • Dataspecs 我以为是 foobar 之类的普通字符串
  • 是的,这是一个普通的字符串,但是您可以在代码中添加仅在以dataspecs 开头的行上进行替换吗?该文件还有许多其他行。
  • 还有一件事@Kent,我发现dataspecs 和v1 之间有两个 空格字符。当前代码将其更改为一个空白字符。我怎样才能将其保留为两个?
  • 在 awk 中保留空白不是那么简单。您可以跟踪每个字段的索引,但这会使脚本变得相当复杂。
【解决方案2】:

Kent 的解决方案很棒。这是另一个选项,涉及从awk 中直接访问 shell 变量

awk '/^dataspecs/{$5=ENVIRON["new_v4"];$6=ENVIRON["new_v5"];}{print}' file.txt > newfile.txt

【讨论】:

  • 由于某种原因,这个解决方案只是用空格替换了两个变量。
  • @brastein,注意需要先导出shell变量
  • 这是怎么做的? Kent 的解决方案似乎从 bash 中获取它们,没问题....另外,我刚刚发现dataspecs 和 v1 之间有 两个 空白字符。你知道我怎样才能把它保持为两个而不是像 Kent 的解决方案那样变成一个吗?
  • 您需要 export Bash 中的变量,以便它们出现在 Awk 的 ENVIRON 变量中。
猜你喜欢
  • 1970-01-01
  • 2014-01-25
  • 2018-02-09
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
相关资源
最近更新 更多