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

Why am I getting this error when trying to use sed command to delete string?

我正在尝试使用 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: '=="root" {print }' shadowCopy.txt


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

我的输出是

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

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

已解决:cp shadowCopy.txt shadowCopy.txt~ && awk 'BEGIN{FS=OFS=":"} =="root"{=""}1' shadowCopy.txt~ > shadowCopy.txt && rm shadowCopy.txt~ 是最终为我做的。以防以后有人想知道

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

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

问题是 sed 不能对字符串进行操作,只能对具有一些额外限制的正则表达式进行操作。这将起作用:

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

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

鉴于您新发布的信息,您想要这个:

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

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

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