sed命令在ubuntu上不能正常工作

sed命令在ubuntu上不能正常工作,sed,Sed,我有一个名为'config_3_setConfigPW.ldif'的文件?包含以下行: {pass} 在终端上,我使用了以下命令 SLAPPASSWD=Pwd&0011 sed -i "s@{pass}@$SLAPPASSWD@" config_3_setConfigPW.ldif 它应该将{pass}替换为Pwd&0011,但它会生成Pwd{pass}0011原因是SLAPPASSWD shell变量在sed看到它之前已展开。因此,塞德看到: sed -i "s@{pass}

我有一个名为'config_3_setConfigPW.ldif'的文件?包含以下行:

{pass}
在终端上,我使用了以下命令

SLAPPASSWD=Pwd&0011   
sed -i "s@{pass}@$SLAPPASSWD@" config_3_setConfigPW.ldif

它应该将
{pass}
替换为
Pwd&0011
,但它会生成
Pwd{pass}0011

原因是SLAPPASSWD shell变量在sed看到它之前已展开。因此,塞德看到:

sed -i "s@{pass}@Pwd&0011@" config_3_setConfigPW.ldif
当一个“&”位于模式的右侧时,它意味着“复制匹配的输入”,在您的情况下,匹配的输入是“{pass}”

真正的问题是,为了防止sed这样做,您必须避开SLAPPASSWD中可能出现的所有特殊字符。例如,如果密码中有字符“@”,sed会认为这是替换命令的结尾,并给出语法错误

因为这个原因,我不会使用sed。你可以试试gawk或perl

例如,这将以awk打印修改后的文件(尽管它仍然假设SLAPPASSWD不包含“字符”)

awk -F \{pass\} ' { print  $1"'${SLAPPASSWD}'"$2 } ' config_3_setConfigPW.ldif

这是因为
$SLAPPASSWD
包含字符序列
&
,它是
sed
使用的元字符,并在
s
命令中计算为匹配的文本。意思是:

sed 's/{pass}/match: &/' <<< '{pass}'

前一段时间我问了这个问题:。答案显示了如何在将密码用作替换部件之前可靠地转义密码:

pwd="Pwd&0011"
pwdEscaped="$(sed 's/[&/\]/\\&/g' <<< "$pwd")"

# Now you can safely pass $pwd to sed
sed -i "s/{pass}/$pwdEscaped/" config_3_setConfigPW.ldif
pwd=“pwd&0011”

pwdEscaped=“$(sed's/[&/\]/\\&/g'记住sed从不对字符串进行操作。sed搜索的东西是一个regexp,它用类似字符串的东西替换它,但有一些元字符需要注意,例如
&
\
,所有这些都需要避免使用sed分隔符,通常是
//code>

如果要对字符串进行操作,则需要使用awk:

awk -v old="{pass}" -v new="$SLAPPASSWD" 's=index($0,old){ $0 = substr($0,1,s-1) new substr($0,s+length(old))} 1' file

如果旧的或新的包含转义字符,甚至上述内容也需要调整。

使用awk的方法是正确的,但使用的语法非常容易出错。建议的方法的正确语法是
awk-F'{pass}'-v new=“$SLAPPASSWD”'{print$1 new$2}
awk -v old="{pass}" -v new="$SLAPPASSWD" 's=index($0,old){ $0 = substr($0,1,s-1) new substr($0,s+length(old))} 1' file