sed命令在ubuntu上不能正常工作
我有一个名为'config_3_setConfigPW.ldif'的文件?包含以下行: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}
{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