我有一个包含以下内容的文件:
<username><![CDATA[name]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[name]]></dbname>
Run Code Online (Sandbox Code Playgroud)
我需要制作一个脚本,将第一行中的“name”更改为“something”,将第二行中的“password”更改为“somethingelse”,将第三行中的“name”更改为“somethingdifferent”。我不能依赖这些在文件中出现的顺序,所以我不能简单地用“something”替换第一次出现的“name”,用“somethingdifferent”替换第二次出现的“name”。我实际上需要搜索周围的字符串,以确保我找到并替换了正确的东西。
到目前为止,我已尝试使用此命令来查找和替换第一个“名称”出现:
sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml
Run Code Online (Sandbox Code Playgroud)
但是它不起作用所以我认为其中一些字符可能需要转义等。
理想情况下,我希望能够使用正则表达式来匹配两个“用户名”出现并仅替换“名称”。像这样的东西,但有sed:
<username>.+?(name).+?</username>
Run Code Online (Sandbox Code Playgroud)
并将括号中的内容替换为“某物”。
这可能吗?
我正在尝试在 bash 脚本的 if 语句中使用 tput 命令,但由于某种原因,它的行为出乎意料。当运行命令然后仅在 if 语句中检查退出代码时,事情可以正常工作,但是,当直接在 if 语句中运行命令时,事情不再起作用。这是一个简单的脚本来说明我的问题:
#!/bin/bash
tput setaf 1
if [ $? ]
then
echo "first if works"
fi
if tput setaf 1
then
echo "second if works"
fi
Run Code Online (Sandbox Code Playgroud)
运行此脚本只会打印“如果有效,则首先”。这两个 if 语句不应该工作,因为它们是等效的吗?我错过了什么吗?顺便说一句,这是在 FreeBSD 上运行的,以防万一。