linux - 变量中包含 "#"的 SED

标签 linux sed

我有一个脚本可以编辑头文件并替换一些文本。

我要替换的文本行是:

#define A MYTEXT

我需要对 MYTEXT 进行一些操作,因此我循环遍历文件以查找字符串并获取值:

if [[ "$line" == *MYTEXT* ]]
then
  echo $line
  bn=`echo $line| cut -d 'Y' -f 2` #split at the Y value in the string
  #operation here and junk here
  sed 's/'$line$'/'$texttoreplace'/g' HeaderFile.h > out.header.h
fi
done < HeaderFile.h

这对于普通字符串来说效果很好,但是 sed 正在消亡:

#define A MYTEXT
sed: 1: "s/#define": unterminated substitute pattern

当我使用的文件中没有“#”时,它工作正常,它只是那个文件。

有什么想法可以解决这个问题吗?

最佳答案

问题

您遇到引用问题。根据您的设置,Bash 会将不带引号的“#”后面的任何内容视为注释。

解决方案

您应该将 sed 表达式括在双引号中,并用大括号将 shell 变量与表达式中周围的文本分开。例如:

line='#define A MYTEXT'
texttoreplace='foo'
echo "$line" | sed "s/${line}$/${texttoreplace}/g"

关于linux - 变量中包含 "#"的 SED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11194659/

相关文章:

java - Tomcat 许多 NioBlockingSelector$BlockPoller 实例填满了内存

python - 并行运行多个子进程 - python 2.7

c - Linux 中 inet_addr_lst 内核符号的用途是什么?

linux - sed 脚本不适用于某些条目

linux - 如何使用 sed 替换文本文件中的文件名

linux - 将文本添加到特定行linux脚本

linux - 如果字符串每行出现一次,如何删除一行?

段错误时未生成核心转储文件

linux - 在 Unix Shell 脚本中从字符串中删除动态后缀模式

regex - 否定字符类中的空白正则表达式