bash - 字符串没有被 sed 命令替换
问题描述
在我的脚本中,我使用下面的 sed 命令
while read line; do
echo "$line"
sed -r "s/where /where $line ;/" Query.cql > Query-2.cql
done < $1
$line的值是
其中 Column11 in ('Value1','Value2','Vlaue3') 和 Column12 in ('Value11','Value22','Vlaue32')
文件内容::
捕获'data.csv'
select * from test where
捕获;
执行后
sed -r "s/where /where $line ;/" Query.cql > Query-2.cql
输出是::
捕获'data.csv'
select * from test where
捕获;
在这里,字符串没有被替换。什么地方出了错?
解决方案
sed: -e 表达式 #1, char 19: 未终止的 `s' 命令
当然s
命令是s/<something>/<else>/
- 有一个尾随/
。做:
sed -r 's/where /$line ;/'
^ - trailing /
该-r
选项似乎未使用 -where
没有扩展的正则表达式。如果是这样,请将其删除。
您的命令使用'
引号,因此$line
不会扩展。研究 shell 中单引号和双引号之间的区别,很可能您打算在"
这里使用。
请注意,每个循环> qWithWhere.cql
都在重新创建结果并覆盖前一个循环的结果。您可能只是在它们的最后一行运行循环。
阅读如何在 bash 中逐行读取文件以及如何为 sed 替换模式转义字符串。
以下代码where
在输入后有一个空格:
cat <<EOF >input
capture 'data.csv'
select * from test where
capture off;
EOF
line="where Column11 in ('Value1','Value2','Vlaue3') and Column12 in ('Value11','Value22','Vlaue32')"
sed -r "s/where /where $line ;/" input
输出:
capture 'data.csv'
select * from test where where Column11 in ('Value1','Value2','Vlaue3') and Column12 in ('Value11','Value22','Vlaue32') ;
capture off;
推荐阅读
- docker - 在 WSL2 上运行 Docker 的僵尸文件夹起死回生
- c# - FormattableString.ToString(IFormatProvider) 的意外行为
- apache-kafka - 如何使用 kafka 控制台生产者发送键、值消息
- python - 无论索引如何,如何找出两个数据帧之间的差异?
- python - 如何使用 Beautiful Soup 从图像中检索标题属性
- css - 使用 SASS 在 @font-face 上强制 src
- mysql - MYSQL 按 id 打印名称,在不同表中出现次数最多
- firebase - Flutter Firestore 执行 updateData 时出错,找不到要更新的文档
- html - :hover 似乎不起作用,我不知道为什么
- android - Android NDK:断言失败:未定义 LOCAL_MAKEFILE