【问题标题】:Sed -i assistance (bash)sed -i 协助 (bash)
【发布时间】:2014-04-09 21:14:29
【问题描述】:

我是 Sed 的新手,正如您想象的那样,您可能会很早就迷路......

我在尝试使用 bash 脚本更改的 PHP 页面中有以下变量:

$username='';

我想给它一个存储在 $myUsername 中的扩展变量值,以便最终条目看起来像:

$username='someName';

我相信我已经接近了以下内容,但似乎无法越过终点线......

sed -i 's/"$username = ''".*$/\$username = /"${myUsername}/"' /var/www/settings.php

感谢您的教育/帮助

【问题讨论】:

  • 为什么你的正则表达式里都有双引号? sed 将尝试匹配这些并失败。
  • shell variables in sed script 的可能重复项
  • 请注意,这对用户名很好,但如果您有包含/ 字符的数据,则无法使用;处理任意数据需要更多涉及的技术。
  • (另外,sed -i 不是 POSIX 标准选项,因此如果您使用它的脚本在其他操作系统上无法运行,请不要感到惊讶)。
  • 感谢大家提供额外的 cmets,非常感谢。

标签: linux bash sed


【解决方案1】:

你快到了,例如使用这个改进的版本:

sed -i "s/\$username = ''/\$username = '$myUsername'/" file

请注意,要使用变量,您需要使用双引号。否则,变量不会被扩展。另外,这就是为什么需要用\$username 转义$username,以避免它被解释为bash 变量$username

测试

$ cat a
hello
$username = '';
bye

$ myUsername="bu"
$ sed "s/\$username = ''/\$username = '$myUsername'/" a
hello
$username = 'bu';
bye

$ myUsername="hello"
$ sed "s/\$username = ''/\$username = '$myUsername'/" a
hello
$username = 'hello';
bye

改进

您还可以通过捕捉障碍物来改进方法。它适用于\( block \) 语法,使用\1 打印回来:

$ sed "s/\(\$username = \)''/\1'$myUsername'/" a
hello
$username = 'hello';
bye

【讨论】:

  • 非常感谢。我知道 "for 扩展,并认为我确实很接近。非常感谢。
猜你喜欢
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 2023-02-13
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多