在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

【讨论】:

MacOS sed 不支持 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删除文件中第一次出现的字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 sed 删除匹配模式不适用于 mac os Catalina

如何从sed输出中删除不可见字符到文件[重复]

linux下sed命令对文件执行文本替换

Mac 上简单使用 Sed

Linux sed 替换第一次出现的字符串

sed删除怎么生效