【问题标题】:How to replace a whole line with sed?如何用 sed 替换整行?
【发布时间】:2012-02-07 23:25:03
【问题描述】:

假设我有一个带行的文件

aaa=bbb

现在我想将它们替换为:

aaa=xxx

我可以这样做:

sed "s/aaa=bbb/aaa=xxx/g"

现在我有一个包含几行的文件,如下所示:

aaa=bbb
aaa=ccc
aaa=ddd
aaa=[其他]

如何使用 sed 将这行 aaa=[something] 替换为 aaa=xxxall

【问题讨论】:

  • [something else] 是文字文本,还是只是一个占位符?等号后面的东西可能的格式是什么?
  • 这更像是一个正则表达式问题,而不是一个 sed 问题。

标签: regex sed


【解决方案1】:

试试这个:

sed "s/aaa=.*/aaa=xxx/g"

【讨论】:

  • 习惯的力量,在这种情况下可以忽略 - 它被用作替换每个匹配的行的全局替换,而不仅仅是第一个。在这种情况下,由于.*,只会匹配第一个。
  • Michael J. Barber, g 用替换替换所有正则表达式实例
  • 添加-i就地修改文件
【解决方案2】:

您也可以使用 sed 的更改行来完成此操作:

sed -i "/aaa=/c\aaa=xxx" your_file_here

这将遍历并找到任何通过aaa= 测试的行,这意味着该行包含字母aaa=。然后它将整行替换为 aaa=xxx。您可以在测试开始时添加^,以确保您只获得以aaa= 开头的行,但这取决于您。

【讨论】:

  • OS X 的sed 要求c 后跟一个反斜杠和一个换行符,它不会将换行符附加到插入的文本中,但您可以使用例如$'/aaa=/c\\\naaa=xxx\n'
  • 这是change/replace feature@Mr. 的 sed 文档中的示例。 T 在谈论。
  • 这是最接近实际执行要求的操作...(但便携性需要 Lri 的版本)
  • 我喜欢它的地方:如果你匹配 range 行,c 将用一行替换整个范围:'/garbage_start/,/garbage_stop/c\[Garbage skipped]'@987654332 @ 不这样做。
【解决方案3】:

像这样:

sed 's/aaa=.*/aaa=xxx/'

如果你想保证aaa= 位于行首,那就写吧:

sed 's/^aaa=.*/aaa=xxx/'

【讨论】:

  • 如果我想用aaa='xxxx'替换怎么办。我尝试像sed 's/aaa=.*/aaa=\'xxx\'/' 一样转义,但这会在新行中打开> 提示...
  • 将单引号改为双引号,如sed "s/aaa=.*/aaa='xxx'/g"
【解决方案4】:
sed -i.bak 's/\(aaa=\).*/\1"xxx"/g' your_file

【讨论】:

    【解决方案5】:

    如果你想使用awk,那么这也可以

    awk -F= '{$2="xxx";print}' OFS="\=" filename
    

    【讨论】:

    • 如何检查“aaa”模式?
    【解决方案6】:

    这可能对你有用:

    cat <<! | sed '/aaa=\(bbb\|ccc\|ddd\)/!s/\(aaa=\).*/\1xxx/'
    > aaa=bbb
    > aaa=ccc
    > aaa=ddd
    > aaa=[something else]
    !
    aaa=bbb
    aaa=ccc
    aaa=ddd
    aaa=xxx
    

    【讨论】:

    • 我不认为对 bbbcccddd 的明确检查是 OP 的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2021-10-08
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多