sed:替换两个字符串之间的文本,而不编辑整行
sed: replacing text between two strings, without editing whole line
我正在尝试制作一个 Raspberry Pi 配置器脚本(在第一次启动 pi 之前),我想实现一个功能来设置密码。我发现可以在/etc/shadow下设置密码,但需要加密。
长话短说:
如何只用 sed 替换两个字符串 pi: 和第二个 : 之间的散列?
pi:$FVPr/I.sQGI3ab3z$rmQMzZDghl/.sJyohBZ2B4Z4Bxkr.zOZJ5c4pVJlHTZEGbO28CoXhgPUZ/gds5km3puT9O2b.K0bIjbNeNTSW/:18277:0:99999:7:::
我想要的脚本输出:
例如
pi:$salty-boi$nt6OkKwSfV4kkk2mcEjEZW1z9rChDK9VeE.c7LE5oFv4Zd.KQbqlN2mSnc9EbcAB.iIlvhRCT10Y6ovLWvaLu.:18277:0:99999:7:::
我试过这个:
sed -i "s|pi:.*:|pi:$RPI_PASSWD_ENCRYPTED:|g" shadow
但我得到的输出是这样的:
pi:$saltypi$NpLE895oMWEr3R6p9f1dZnekSeJq8QdAk8tQu08rTF3gsnKVoKX7Z.JsNyBCg.o/QamYgzr.w7dVoRyi5nFBM.:
之后没有这个:18277:0:99999:7:::
这是我的脚本示例:
#!/bin/bash
exitstatus=$?
RPI_PASSWD=$(whiptail --inputbox "Type a password for user pi. Press cancel to skip." 8 40 --title "Changing default password" --ok-button "Ok" --cancel-button "Cancel" 3>&1 1>&2 2>&3)
if [ $exitstatus = 0 ]; then
RPI_PASSWD_ENCRYPTED=$(openssl passwd -6 -salt saltypi $RPI_PASSWD)
sed -i "s|pi:.*:|pi:$RPI_PASSWD_ENCRYPTED:|g" shadow
fi
exit 1
Sed 的 *
运算符是贪婪的,会吃到行尾的最后一个 :
。
您可以使用后跟 *
的非冒号括号表达式,它只会匹配下一个 :
、
"s|pi:[^:]*:|pi:$RPI_PASSWD_ENCRYPTED:|g"
我正在尝试制作一个 Raspberry Pi 配置器脚本(在第一次启动 pi 之前),我想实现一个功能来设置密码。我发现可以在/etc/shadow下设置密码,但需要加密。
长话短说:
如何只用 sed 替换两个字符串 pi: 和第二个 : 之间的散列?
pi:$FVPr/I.sQGI3ab3z$rmQMzZDghl/.sJyohBZ2B4Z4Bxkr.zOZJ5c4pVJlHTZEGbO28CoXhgPUZ/gds5km3puT9O2b.K0bIjbNeNTSW/:18277:0:99999:7:::
我想要的脚本输出:
例如
pi:$salty-boi$nt6OkKwSfV4kkk2mcEjEZW1z9rChDK9VeE.c7LE5oFv4Zd.KQbqlN2mSnc9EbcAB.iIlvhRCT10Y6ovLWvaLu.:18277:0:99999:7:::
我试过这个:
sed -i "s|pi:.*:|pi:$RPI_PASSWD_ENCRYPTED:|g" shadow
但我得到的输出是这样的:
pi:$saltypi$NpLE895oMWEr3R6p9f1dZnekSeJq8QdAk8tQu08rTF3gsnKVoKX7Z.JsNyBCg.o/QamYgzr.w7dVoRyi5nFBM.:
之后没有这个:18277:0:99999:7:::
这是我的脚本示例:
#!/bin/bash
exitstatus=$?
RPI_PASSWD=$(whiptail --inputbox "Type a password for user pi. Press cancel to skip." 8 40 --title "Changing default password" --ok-button "Ok" --cancel-button "Cancel" 3>&1 1>&2 2>&3)
if [ $exitstatus = 0 ]; then
RPI_PASSWD_ENCRYPTED=$(openssl passwd -6 -salt saltypi $RPI_PASSWD)
sed -i "s|pi:.*:|pi:$RPI_PASSWD_ENCRYPTED:|g" shadow
fi
exit 1
Sed 的 *
运算符是贪婪的,会吃到行尾的最后一个 :
。
您可以使用后跟 *
的非冒号括号表达式,它只会匹配下一个 :
、
"s|pi:[^:]*:|pi:$RPI_PASSWD_ENCRYPTED:|g"