gpt4 book ai didi

bash - 为什么我们可以通过添加 "g"来用 sed 替换字符串?

转载 作者:行者123 更新时间:2023-12-05 06:37:48 25 4
gpt4 key购买 nike

如果你想用"ABC"替换一次"abc",你会这样写

sed -e "s/abc/ABC/" <file name> #code1

如果你想在一行中无限次地替换它们,你会这样写

sed -e "s/abc/ABC/g" <file name> #code2

这个“g”是什么意思?我相信 code1 的行为如下所示。

  1. 文件的第一行被复制到模式空间。
  2. 模式空间中字符串中的
  3. "abc" 被替换为 "ABC"
  4. 显示模式空间中被替换的字符串。
  5. 将文件的下一行复制到模式空间,重复process2和process3。

根据 man sed,'g' 命令表示“将保持空间复制到模式空间”。

现在出现一个问题。除非复制模式空间的内容,否则保留空间不会保持为空吗?我理解 'g' 复制保持空间到模式空间,但我认为保持空间总是空的。相反,我认为你应该这样写

sed -e "hs/abc/ABC/g" <file name> #code3

根据 man sed'h' 表示 “复制模式空间以容纳空间”

我完全不理解保留空间的行为。谁能帮帮我?

最佳答案

全局修饰符

在此上下文中,模式末尾的 g 是前面表达式的标志或修饰符,实用上表示“全局替换(在当前模式空间内)”。

更正式地说,在 BSD 的 sed(1) 中,标志说:

g       Make the substitution for all non-overlapping
matches of the regular expression, not just the
first one.

例如:

# Replace only the first match.
$ echo 12345 | sed 's/[[:digit:]]/0/'
02345

# Replace all matches in the pattern, e.g. [g]lobal replacement.
$ echo 12345 | sed 's/[[:digit:]]/0/g'
00000

当然还有其他方法可以通过这个相当人为的示例获得此结果,但关键是 g 修饰符在当前模式中表示“全局”。

修饰符/标志与命令

替换标志的使用与 gG 命令 形成对比,它们将保留空间复制或附加到模式空间。尽管标志和命令看起来很相似,但它们通常用于不同的上下文,并且具有完全不同的行为。乍一看可能令人困惑,但命令并不直接与(也不会修改)替换表达式相关联,这可以帮助您区分它们。

关于bash - 为什么我们可以通过添加 "g"来用 sed 替换字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47093047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com