sed 查找并替换为斜杠

sed 查找并替换为斜杠

我在使用 sed find/replace 查找参数中的斜杠时遇到问题。

test.sh 的示例内容

str=$(sed -n '/^user:/p' /tmp/shadowtest) # find "user:" line in /etc/shadowtest
arr=(${str//:/ }) # explode str with : as delimeter
arr=${arr[1]} # grab the 2nd element
sed -i 's|$arr|XXXXX|g' /tmp/shadowtest # Nothing gets replaced in shadowtest

/tmp/shadowtest 的示例内容

# junk here
user:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7:::
# junk here

当我按原样运行脚本时,shadowtest 文件中没有任何内容被替换。但是如果我将 sed 命令更改为类似的命令

sed -i 's|99999|XXXXX|g' /tmp/shadowtest

效果很好。

答案1

如果您希望 $arr 被替换,则需要将其放在单引号之外。例如:

sed -i "s|$arr|XXXXX|g" /tmp/shadowtest

答案2

如果我正确理解您代码的用途,那么在您的示例中:

$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0

应替换为:

XXXXX

如果这是真的,那么您根本不需要涉及 shell:

sed '/^user:/s/:[^:]*/:XXXXX/
' <<\DATA
# junk here
user:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7:::
other:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7:::
user:different stuff in this spot:16310:0:99999:7:::
# junk here
DATA

输出

# junk here
user:XXXXX:16310:0:99999:7:::
other:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7:::
user:XXXXX:16310:0:99999:7:::
# junk here

它的工作方式与您自己的方式相同(主要是),因为它只处理以 string 开头的行user:,但是,它不是对p它们执行该函数,s///而是执行该函数。

它将字符串替换为以字符串开头的行中紧接其后的:XXXXX第一个非字符序列。::user:

相关内容