【问题标题】:Awk replace string in lineawk 替换行中的字符串
【发布时间】:2016-09-02 06:29:58
【问题描述】:

注意: 这个问题看起来像previously posted one,但正如cmets中提到的,它原来是chameleon question. 我接受了答案,我在这里发布了同样的问题,但“解决方案条件”略有不同。


我有一个像这样的文件test.txt(但包含更多行)

/foo/bar/how /SOME_TEXT_HERE/hello
/foo/bar/are hello/SOME_OTHER_TEXT
/foo/bar/you hello

我想得到这个输出:

/foo/bar/how /SOME_TEXT_HERE/how
/foo/bar/are are/SOME_OTHER_TEXT
/foo/bar/you you

我试过这个:

while read line
do
bla=$(echo $line | cut -f4 -d"/" | cut -f1 -d" ")
sed -i "s/hello/$bla/" test.txt
done <test.txt

但是输出是:

/foo/bar/how /SOME_TEXT_HERE/how
/foo/bar/are how/SOME_OTHER_TEXT
/foo/bar/you how

注意

我想要解决方案:

  1. 允许我定义一个变量(此处为bla),我将手动定义该变量,并且从一个文件到另一个文件不同(因此不使用基本字段位置之类的东西),而是使用cut 或其他命令和我的例子一样)

  2. 用这个变量替换行中其他地方的特定字符串(所以不是像$2这样的字段位置,而是像s/hello/$bla这样的字段位置)

虽然我不确定这是否可能(显然我不知道如何自己做到这一点......),但感谢您的时间尝试! :)

【问题讨论】:

  • 你没有接受我在上一个问题中给你的建议。您的示例输入仍然是晴天,彩虹和蝴蝶是您之前拥有的,因此,例如,仍然没有不包含hello 的行,没有在行中多次包含它的行(/foo/hello/how hello),没有包含它作为最后一个字段 (/foo/bar/how chellogram) 或 RE 元字符或空格的一部分的行,或者您需要在示例输入中涵盖的十几个其他内容中的任何一个,或者您获得的解决方案在它们出现在您的真实输入。 思考并展示最坏的情况。
  • 请发[ mcve ]
  • 这里有 3 个提示 1.echo "str" | sed 's/t/T' 2.grymoire.com/Unix/sed.html(请阅读sed 教程)。 3.你不需要你的复杂$(echo ... | cut | cut )。这是非常低效的,尤其是对于大文件。还有...... ED 和 sjsam 说了什么!祝你好运。
  • @Ed Morton 我编辑了它。这是我的数据中可能遇到的最坏情况。
  • @tlorin 不,不是。例如,它不包括/foo/bar/are hello/hello,也不包括/foo/bar/are chellogram,也不包括/foo/bar/a&amp;b hello(注意反向引用),也不包括你想要替换hello而不是foo.bar(注意RE元字符)的情况,也不包括@ 987654345@,等等,等等……祝你好运。

标签: bash awk sed


【解决方案1】:
awk '{sub(/are hello/,"are are")sub(/you hello/,"you you")}1' file

/foo/bar/how /SOME_TEXT_HERE/hello
/foo/bar/are are/SOME_OTHER_TEXT
/foo/bar/you you

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 2015-12-18
    • 2015-01-13
    • 1970-01-01
    • 2019-11-21
    • 2017-02-08
    • 2016-08-27
    • 1970-01-01
    相关资源
    最近更新 更多