Bash 在mac上使用sed删除文件中首次出现的字符串
从中我找到了这个命令,它在没有任何命令替换的情况下工作。但是如果我尝试替换命令中的变量,我会遇到以下问题 注意:我使用的是sed命令(BSD-OSX)/MacOS 要复制,只需使用以下命令创建file.txt: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
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”
。MacOSsed
不支持GNUsed
扩展名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