我正在尝试使用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~最终是为我完成的。万一将来有人在乎

最佳答案

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

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

09-28 01:54
查看更多