当分配给变量时,具有放置模式的sed停止工作

时间:2017-05-23 18:48:43

标签: bash shell unix sed

我一直在使用sed作为文本处理和清理的一部分。其中一个文本更改要求我用一个数字替换方括号,只用数字(没有空格)。这是一个例子:

a[1]将成为a1

(我不能简单地删除所有方括号,因为其中一些是必需的。由于这种限制,我不得不求助于替换模式。如果有另一个sed(或其他)在没有替换模式的情况下执行相同工作的表达式然后我会很高兴看到它,但我仍然对我的错误的性质感到好奇。)

这是我使用的命令:

sed 's/\[\([^] ]*\)\]/\1/g' file.txt

其中file.txt可以包含:

[ [ a[1](t) + b[1](t) ] + [ a[2](t) * b[2](t) ] ]

该命令将产生

[ [ a1(t) + b1(t) ] + [ a2(t) * b2(t) ] ]

现在我尝试通过将其放入脚本来实现自动化。由于我需要以许多其他方式操作文本,然后我创建一个临时变量来保持方括号更改。这是''脚本:

#!/bin/bash
#$1 is file name.
square_change=$(sed 's/\[\([^] ]*\)\]/\1/g' "$1")
echo $square_change

./script.sh file.txt输出:

[ [ a1(t) + b1(t) ] + [ a2(t) file2.txt file.txt script.sh b2(t) ] ] 其中file2.txt file.txt script.sh是我脚本目录中的文件。

我希望它输出sed 's/\[\([^] ]*\)\]/\1/g' file.txt最初所做的事情。我花了一些时间尝试不同的东西,但似乎什么都没有用。关于我哪里出错的任何想法?

干杯,

2 个答案:

答案 0 :(得分:2)

Unix shell脚本中最烦人(但最灵活)的事情之一是引用。您的脚本的正确版本如下:

#!/bin/bash
#$1 is file name.
square_change="$(sed 's/\[\([^] ]*\)\]/\1/g' "$1")"
echo "$square_change"

在您的情况下,echo $square_change读取为echo ... * ...,因此*将被当前目录中的文件列表替换。 ($()周围的引号并非绝对必要,但有助于引用"的必要习惯。)

答案 1 :(得分:0)

由于您想要在[...]之间替换数字,因此您可以使用:

s='[ [ a[1](t)  +  b[1](t) ] + [ a[2](t) * b[2](t) ] ]'
sed -E 's/\[([0-9]+)\]/\1/g' <<< "$s"

[ [ a1(t)  +  b1(t) ] + [ a2(t) * b2(t) ] ]