linux - 如何转义 sed 输入文件

标签 linux bash unix sed zsh

我正在尝试制作一个简单的 bash 脚本,它接受输入文件并替换占位符,例如 &date按实际值(本例中为日期)

示例:

text=$(sed -e "s/&file/$FILE/" -e "s/&date/$DATE/" $FILE)
echo $text

问题:

  1. 换行符被删除,所有行都混在一起。
  2. 诸如/******之类的东西放置在文件开头的内容更改为 /bin /boot etc (因此路径已解决)。 *****/也将被替换。

示例:

输入:

/**********************************
hello
**********************************/

输出(中间换行以使其可读):

/bin /boot /dev /etc /home /lib /lib64 /mnt
/opt /proc /root /run /sbin /srv /sys /tmp /usr /var hello parent/ parent_neighbor/

我想我需要转义该文件,但我找不到任何地方可以做到这一点。

最佳答案

发生根目录扩展是因为 '/************' 被 Bash 路径名扩展解释为“根目录通配符通配符通配符......”

我什至不会为此使用 sed,它的正则表达式语法有点令人不快。 Perl 怎么样:

text=$(perl -pe 's/&file/'"$FILE"'/g; s/&date/'"$DATE"'/g' $FILE)
echo "$text"

正如 @Gordon Davisson 在评论中所说,这里的关键是在用作 echo 的参数时引用 "$text",这样 Bash 就不会将“/***”视为路径,并在调用 echo 之前扩展它。

编辑:这是一个链接:http://wiki.bash-hackers.org/syntax/expansion/globs

关于linux - 如何转义 sed 输入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53111252/

相关文章:

linux - 通过 SSH 提示输入密码发出命令

linux - Bash 脚本也在目录内创建符号链接(symbolic link)

arrays - bash 关联数组——包含值对的变量

bash - 后跟条件控制运算符时在子 shell 中忽略 set -e

unix - 收到电子邮件时触发 shell 脚本

linux - 如果调用另一个实例,则重新运行 bash 脚本

linux - Bash 脚本搜索和替换

Bash 转义/扩展命令

c - 打开并写入文件函数/将变量传递给c中的函数?

shell - 在linux中查找叶目录