我想在一个配置文件中搜索这个表达式:"central.database".

配置文件的布局最初如下所示:

central.database = SQLFIRSTTEST

这就是我希望sed更换后的外观:

central.database = SQLTEST

我是在bash脚本中完成这项工作的,欢迎提供任何建议、建议或替代解决方案!

(实际上,central.databaseSQLTEST都来自这里的bash变量.)


我当前的代码(第三次try ):

sshRetValue=$(ssh -p "35903" -i $HOME/sshids/idrsa-1.old ${1} <<EOF
        sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
        echo $?
EOF
)

错误消息:

Pseudo-terminal will not be allocated because stdin is not a terminal.
sed: -e expression #1, char 58: unknown option to `s'
-bash: line 3: EOF: command not found

推荐答案

下面是一个示例表达式:

sed -i 's/^\(central\.database\s*=\s*\).*$/\1SQLTEST/' file.cfg

如果要将内容与其中的/匹配,可以使用另一个分隔符:

sed -i 's#^\(cent/ral\.data/base\s*=\s*\).*$#\1SQL/TEST#' file.cfg

或者使用可变扩展:

VAL="SQLTEST"
sed -i "s/^\(central\.database\s*=\s*\).*\$/\1$VAL/" file.cfg

在你的例子中:

sshRetValue=`sed -i "s/^\(\1$CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt`;

$CENTRAL_DB_名称前有一个\1无效.此外,sed不会打印它的返回值.这是判断返回值的首选方法:

sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
sed_return_value=$?

最终连接到ssh(未测试):

sed_return_value=$(ssh server <<EOF
    sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
    echo $?
EOF
)

i用于替换输入文件中的数据.否则sed会写信给stdout.

正则表达式本身就是一个领域.要用stackoverflow的答案来深入解释它们是不可能的,除非有某种特定的功能让你无法理解.

Linux相关问答推荐

Linux内核中维护进程无关寄存器失败

Bash:将带有新行的字符串转换为带有逗号、内联的唯一值的字符串

从 MariaDB 连接到 Oracle 时出现错误消息libsqora.so.11.1:找不到文件

使用 sed linux 命令和 i sed 命令进行 preprend 时的反向引用

文件未在脚本中使用 cp 命令复制到 Docker 容器中

树莓派拒绝连接到瓶子服务器

为什么 printf 仍然可以使用低于 XMM 寄存器中 FP args 数量的 RAX?

什么是`quote`命令?

具体来说,fork() 如何处理 Linux 中 malloc() 动态分配的内存?

使用 RPATH 但不使用 RUNPATH?

如何在 shell 脚本中动态生成新的变量名?

通过写入 /dev/input/mice 来控制鼠标

通过 VM 的 Centos - 镜像列表中没有 URL

如何让 PHP、Symlinks 和 __FILE__ 很好地协同工作?

为什么 mmap() 比顺序 IO 快?

execv() 和 fork() 的时间浪费

什么是适用于 Linux 的好的 Prolog IDE?

使用 SED 将单词的首字母大写

如何在我的终端中编辑文本文件

如何始终以 GB 为单位获取 df linux 命令输出