首页 > 解决方案 > 字符串没有被 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

捕获;

在这里,字符串没有被替换。什么地方出了错?

标签: bashsed

解决方案


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;
                  

推荐阅读