是否可以使用sed对变量进行范围调整?

时间:2015-02-03 21:51:40

标签: bash sed

我试图按如下方式使用sed:

sed -i "7,$n_line s/abcd/efgh/g" file

我收到一条错误说:意外的`,'

2 个答案:

答案 0 :(得分:1)

如果将n_line设置为数值(即您正在使用行号进行范围(例如:7,9),这将按原样运行。

但是,如果将n_line设置为模式(即您使用行号和模式进行范围调整(例如:7,yyy),则unexpected,'`将返回为要解决此问题,请将命令更改为:

sed -i "7,/$n_line/ s/abcd/efgh/g" file

示例:

AMD$ cat File
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aayyyaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa

AMD$ cat Script
#!/bin/bash

echo "Example 1: n is numeric"
n=4
sed "2,$n s/a/b/g" File

echo ""
echo "Example 2: n is pattern (working case)"
n="yyy"
sed "2,/$n/ s/a/b/g" File

echo ""
echo "Example 3: n is pattern (error case)"
n="yyy"
sed "2,$n s/a/b/g" File

AMD$ ./Script
Example 1: n is numeric

aaaaaaaaaaaaaa
bbbbbbbbbbbbbb
bbbbbbbbbbbbbb
bbyyybbbbbbbbb
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
Example 2: n is pattern (working case)

aaaaaaaaaaaaaa
bbbbbbbbbbbbbb
bbbbbbbbbbbbbb
bbyyybbbbbbbbb
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
Example 3: n is pattern (error case)

sed: -e expression #1, char 3: unexpected `,'

答案 1 :(得分:1)

sed -i "7,${n_line=0} s/abcd/efgh/g" file

保证一点,以确保n_line至少等于0替换(或任何其他所需值)。这不会检查变量是数字还是空