小编Har*_*cle的帖子

使用 sed 查找和替换复杂字符串(最好使用正则表达式)

我有一个包含以下内容的文件:

<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)

并将括号中的内容替换为“某物”。

这可能吗?

sed quoting regular-expression

159
推荐指数
5
解决办法
51万
查看次数

tput 命令在 if 语句中不起作用

我正在尝试在 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 上运行的,以防万一。

freebsd bash shell-script tput exit-status

1
推荐指数
1
解决办法
318
查看次数