在mac上使用sed删除文件中第一次出现的字符串[重复]
Posted
技术标签:
【中文标题】在mac上使用sed删除文件中第一次出现的字符串[重复]【英文标题】:Removing first occurrence of a string in a file with sed on mac [duplicate] 【发布时间】:2019-04-17 11:36:12 【问题描述】:来自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 $
在一个 privious 答案中,我得到了这个(“,”添加到“1,$”:
sed -i '' "1h; 1,$ x; s/CHANGE_THIS/$TMP/; p; " file.txt
预期的输出文件.txt
SOME_TEXT
export PATH=/Users/Name/with pace/and_variables:$PATH
CHANGE_THIS
CHANGE_THIS
我明白了:
SOME_TEXT
SOME_TEXT
SOME_TEXT
SOME_TEXT
【问题讨论】:
既然可以直接将文本粘贴到 sed 命令中,为什么还要使用变量呢?如果你真的想这样做,试试"$TMP"
。
【参考方案1】:
用途:
sed -i '0,/.*CHANGE_THIS.*/s//my changed line/' file
【讨论】:
MacOSsed
不支持 GNU sed
扩展 0,
【参考方案2】:
如果您对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.
【讨论】:
谢谢它的工作 - 只是打印到控制台 - 我现在做“awk ...”>> newfile.txt以上是关于在mac上使用sed删除文件中第一次出现的字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章