4

我一直在整理一个 bash 脚本,我需要在其中更新一个包含一些必要信息的文件。我正在使用的命令如下:

sudo sed '
/end/ a\
First line to update\
  param 1 'var1'\
  param 2 'var2'\
  param 3 'var3'\
  param 4 'var4'\
end\
' TestFile >TestFileNew

现在这应该使用数据更新文件,并且应该如下所示:

end
First line to update
  param 1 'var1'
  param 2 'var2'
  param 3 'var3'
  param 4 'var4'
end

该文件确实被创建并且数据在其中但是它似乎从文本中去除了'符号,我不希望这种情况发生,有人可以帮忙吗?下面是实际生产的示例:

end
First line to update
  param 1 var1
  param 2 var2
  param 3 var3
  param 4 var4
end
4

4 回答 4

6

用作""外引号:

sudo sed "
/end/ a\\
First line to update\\
  param 1 'var1'\\
  param 2 'var2'\\
  param 3 'var3'\\
  param 4 'var4'\\
end\\
" TestFile >TestFileNew
于 2012-08-01T15:40:58.597 回答
4

看起来伊戈尔已经提供了一个可能适用于单引号的答案。

关于文件创建,请记住它会影响您正在运行sudo的程序 ( ) 作为其选项。sed它不会影响由您的 shell 处理的重定向。因此,如果您没有权限作为用户write TestFileNew, sudo 不会帮助您,就像您在上面使用它的方式一样。

您最好在其他地方创建输出,然后使用 sudo 将其移动到位。

sudo sed "/end/ ..." TestFile > /tmp/TestFileNew
sudo mv /tmp/TestFileNew ./TestFileNew

或者,整个脚本可以使用 sudo 运行...即/path/to/myscript

#!/bin/bash

sed "/end/ ..." TestFile > TestFileNew

然后:

$ sudo /path/to/myscript

然后 sudo 运行bash而不是 sed,特权 bash 实例负责处理脚本内的重定向。

于 2012-08-01T15:55:35.917 回答
1

有时您必须处理两种类型的引号(例如 html 和 javascript)。那么把sed命令放到一个脚本里就很方便了:

cat >FILE
end

cat >script.sed
/end/ a\
First line to update\
 param 1 'var1'\
 param 2 'var2'\
 param 3 'var3'\
 param 4 'var4'\
end            

sed -f script.sed FILE 
end
First line to update
  param 1 'var1'
  param 2 'var2'
  param 3 'var3'
  param 4 'var4'
end
于 2012-08-01T16:06:24.817 回答
1

r在这种情况下,使用 sed 的命令可能会更简单:

$ cat > /tmp/repl << EOF
First line to update
  param 1 'var1'
  param 2 'var2'
  param 3 'var3'
  param 4 'var4'
end
EOF
$ sed '/end/r/tmp/repl' TestFile
$ rm /tmp/repl

(我忽略了 sudo/redirect 问题,但您可能想要这样做sudo sh -c 'sed /end/r/tmp/repl/ TestFile > TestFileNew'

于 2012-08-01T16:23:50.077 回答