尝试使用sed命令删除字符串时,为什么会出现此错误?

时间:2015-02-24 22:56:13

标签: linux bash awk sed

我正在尝试使用sed从给定文件中删除字符串。要删除的字符串存储在password中。这就是我所拥有的 sed -i "s/$password//g" shadowCopy.txt

一直告诉我 sed: -e expression #1, char 0: no previous regular expression

据我所知,在为替换正则表达式指定的位置显示空白时,我正在大吼大叫,但我不想用任何东西替换它。很多网上看起来都说我按照自己应有的方式去做。任何猜测?

我也试过blank=""                     sed -i "s/$password/$blank/g" shadowCopy.txt给了我同样的错误。我也考虑过以某种方式使用awk,但无法找到方法。关于删除文件中字符串的方法的任何建议都将满足

编辑:使用下面的建议我的代码如下

    #Retrieve the root password hash from shadowCopy
    password= awk -F: '$1=="root" {print $2}' shadowCopy.txt


    #Remove the root password
    pw="$password" perl -pe 'BEGIN { $search = quotemeta($ENV{pw}); } s/$search//g' shadowCopy.txt

我的输出是

    $1$aj/Pot/V$H4A7chbz7rfsRIrdL7GO61 //This is the password
    root:$1$aj/Pot/V$H4A7chbz7rfsRIrdL7GO61:16469:0:99999:7:::
    bin:*:16229:0:99999:7:::

为什么打印出密码?显然,当转储文件内容以显示更改时,密码仍然存在。如果我添加echo $password没有任何内容打印得那么清楚它没有被正确初始化。显然,我的赋值行中的代码有点工作,因为它打印出我想要的东西,但它不存储在变量中

已解决:cp shadowCopy.txt shadowCopy.txt~ && awk 'BEGIN{FS=OFS=":"} $1=="root"{$2=""}1' shadowCopy.txt~ > shadowCopy.txt && rm shadowCopy.txt~实际上最终是为我做的。如果将来有人关心

2 个答案:

答案 0 :(得分:2)

问题是sed不能对字符串进行操作,只能在带有一些额外限制的regexp上操作。这将有效:

awk -v tgt="$password" 's=index($0,tgt){$0 = substr($0,1,s-1) substr($0,s+length(tgt)}1' file

因为它只使用字符串操作。

鉴于您新发布的信息,您需要:

awk 'BEGIN{FS=OFS=":"} $1=="root"{$2=""} 1' shadowCopy.txt > tmp$$ &&
mv tmp$$ shadowCopy.txt 

或者如果您有GNU awk并且不关心不命名tmp文件:

awk -i inplace 'BEGIN{FS=OFS=":"} $1=="root"{$2=""} 1' shadowCopy.txt

答案 1 :(得分:1)

当您的变量解析为空字符串时会发生这种情况。看:

p="a" && sed "s/$p/?/g" infile

产量:

J?n 16 08:33:18 m?il.

p="" && sed "s/$p//" infile

产量:

sed: -e expression #1, char 0: no previous regular expression