我正在尝试使用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~
实际上最终是为我做的。如果将来有人关心
答案 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