我正在尝试使用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