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

Bash 在mac上使用sed删除文件中首次出现的字符串,bash,sed,Bash,Sed,从中我找到了这个命令,它在没有任何命令替换的情况下工作。但是如果我尝试替换命令中的变量,我会遇到以下问题 注意:我使用的是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

从中我找到了这个命令,它在没有任何命令替换的情况下工作。但是如果我尝试替换命令中的变量,我会遇到以下问题

注意:我使用的是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,$”后面加了一个(“,”):

预期输出文件.txt

SOME_TEXT
export PATH=/Users/Name/with pace/and_variables:$PATH
CHANGE_THIS
CHANGE_THIS
我明白了:

SOME_TEXT
SOME_TEXT
SOME_TEXT
SOME_TEXT

如果您同意
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
如果您想将输出保存到输入文件本身,请在上述代码中附加
>临时文件和&mv临时文件输入文件

这里也添加了对上述代码的解释

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.
使用:


既然可以直接将文本粘贴到sed命令中,为什么还要使用变量呢?如果您真的想这样做,请尝试
“$TMP”
。MacOS
sed
不支持GNU
sed
扩展名
0,
谢谢它可以工作-只需打印到控制台-我现在可以使用“awk…”>>newfile.txt
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.
sed -i '0,/.*CHANGE_THIS.*/s//my changed line/' file