awk 替换行中的字符串

问题描述 投票:0回答:2

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


我有一个像这样的文件

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
    这样的东西)

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

bash awk sed
2个回答
11
投票
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

0
投票

您想要做的是超级简单使用

sed

$ sed -E <file '
s/(how.*)hello/\1how/
s/(you.*)hello/\1you/
s/(are.*)hello/\1are/'
/foo/bar/how /SOME_TEXT_HERE/how
/foo/bar/are are/SOME_OTHER_TEXT
/foo/bar/you you
$
© www.soinside.com 2019 - 2024. All rights reserved.