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