【问题标题】:Removing first occurrence of a string in a file with sed on mac [duplicate]在mac上使用sed删除文件中第一次出现的字符串[重复]
【发布时间】: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"

标签: bash sed


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 2021-12-22
  • 2014-07-05
  • 1970-01-01
相关资源
最近更新 更多