Bash Awk替换行中的字符串

Bash Awk替换行中的字符串,bash,awk,sed,Bash,Awk,Sed,注: 这个问题看起来像一个问题,但正如评论中提到的,它原来是一个问题 我接受了答案,我在这里发布了相同的问题,但“解决条件”略有不同 我有一个类似这样的文件test.txt(但包含更多行) 我希望获得以下输出: /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"/"

注: 这个问题看起来像一个问题,但正如评论中提到的,它原来是一个问题 我接受了答案,我在这里发布了相同的问题,但“解决条件”略有不同


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

我希望获得以下输出:

/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
注意

我希望解决方案是:

  • 请允许我定义一个变量(此处为
    bla
    ),我将手动定义该变量,并以不同的方式将其从一个文件定义到另一个文件(因此不要像基本字段位置那样使用sthg),而是使用
    cut
    或其他命令,如我的示例所示)

  • 用该变量替换行中其他地方的特定字符串(因此不是像
    $2
    这样的字段位置,而是像
    s/hello/$bla


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

    你没有采纳我在上一个问题中给你的建议。您的示例输入仍然是以前的晴天、彩虹和蝴蝶,因此,例如,仍然没有不包含
    hello
    的行,没有在行中多次包含它的行(
    /foo/hello/how hello
    ),没有作为最后一个字段的一部分包含它的行(
    /foo/bar/how chellogram
    )或者重新设置元字符、空格,或者您需要在示例输入中涵盖的其他十几种内容中的任何一种,或者当它们出现在实际输入中时,您得到的解决方案将失败。思考并展示最坏的情况。请发布一个。这里有3个提示1<代码>回显“str”| sed“s/t/t”2。(请阅读
    sed
    教程)。3.您不需要复杂的
    $(echo…| cut | cut)
    。这是非常低效的,尤其是对于大文件。也。。。埃德和萨姆说了什么!“祝你好运!”埃德·莫顿我编辑了它。这是我的数据中可能出现的最糟糕的情况。@tlorin不,不是。例如,它不包括
    /foo/bar/are hello/hello
    ,也不包括
    /foo/bar/are chellogram
    /foo/bar/a&b hello
    (注意反向引用),也不包括要替换
    foo.bar
    (注意RE元字符)而不是
    hello
    的情况,等等。。。祝你好运
    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
    
    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