在Mac上使用sed删除文件中字符串的首次出现

时间:2018-11-14 13:24:16

标签: bash sed

我从this中找到了该命令,该命令无需任何命令替换即可工作。但是,如果我尝试在命令中替换变量,则会遇到以下问题。

注意:我正在使用sed命令(BSD OSX)/ MacOS

要复制,只需使用以下命令创建一个file.txt:

SOME_TEXT
CHANGE_THIS
CHANGE_THIS
CHANGE_THIS

在终端中添加TMP变量:

TMP=export PATH=/Users/Name/with pace/and_variables:$PATH

现在使用此命令:

sed -i '' "1h; 1 $ { x; s/CHANGE_THIS/$TMP/; p; }" file.txt

我收到此错误:

sed: 1: "1h; 1 $ { x; s/CHANGE_T ...": invalid command code $

在一个秘密的答案中,我得到了这个(“,”加到“ 1,$”:

sed -i '' "1h; 1,$ { x; s/CHANGE_THIS/$TMP/; p; }" file.txt   

预期的输出file.txt

SOME_TEXT
export PATH=/Users/Name/with pace/and_variables:$PATH
CHANGE_THIS
CHANGE_THIS

我明白了:

SOME_TEXT
SOME_TEXT
SOME_TEXT
SOME_TEXT

2 个答案:

答案 0 :(得分:1)

使用:

sed -i '0,/.*CHANGE_THIS.*/s//my changed line/' file

答案 1 :(得分:0)

如果您对awk没问题,请尝试遵循。

##Creating shell variable named TM here.
TMP="export PATH=/Users/Name/with pace/and_variables:$PATH"
awk -v tmp="$TMP" '/CHANGE_THIS/ && ++flag==1{$0=tmp} 1' Input_file

如果您要将输出保存到Input_file本身,则也可以在上面的代码中附加> temp_file && mv temp_file Input_file

也在此处为上述代码添加说明。

awk -v tmp="$TMP" '              ##Creating an awk variable named tmp whose value is bash variable TMP value.
/CHANGE_THIS/ && ++flag==1{      ##Checking condition if a line is having string CHANGE_THIS and variable flag value is 1 then do following.
  $0=tmp                         ##Setting current line value to value of tmp awk variable here.
}                                ##Closing the block for condition here.
1                                ##By mentioning 1 printing edited/non-edited line here.
' Input_file                     ##Mentioning Input_file name here.