gpt4 book ai didi

csv - 如何限制 sed 仅替换出现在第一个右方括号之后的数据?

转载 作者:行者123 更新时间:2023-12-04 23:26:19 25 4
gpt4 key购买 nike

我有一个使用高度自定义格式的 CSV 文件。这里,每个数字代表 4 列中每一列的数据:

1 2 [3] 4

我需要限制 sed仅搜索和修改出现在第四列中的数据。本质上,它必须忽略第一次出现右方括号和空格之前出现的行上的所有数据, ]并且只修改之后出现的数据。例如, file1.txt可能包含这个:
penguin bird [lives in Antarctica] The penguin lives in cold places.
wolf dog [lives in Antarctica with penguins] The wolf likes to eat penguins.

替换可能是 sed 's/penguin/animal/g' file1.txt .运行脚本后,输出将如下所示:
penguin bird [lives in Antarctica] The animal lives in cold places.
wolf dog [lives in Antarctica with penguins] The wolf likes to eat animal.

在这种情况下, penguin 的所有出现在第一个 ] 之前被忽略并且仅在之后出现的行上更改。
  • 额外的右括号可能会出现在该行的后面,但只有第一个应该被视为分割。

  • 我怎么会有 sed在查找和替换文本时忽略此自定义 CSV 格式的前三列?

    我有 GNU sed 版本 4.2.1。

    最佳答案

    您告诉 sed 搜索 '] ' 组合后跟 .* (任何东西),然后作为替代品的一部分,您将 ] 放回原处。字符。

    唯一的问题是sed通常“认为”一个 ] char 是字符类定义的一部分,因此您必须对其进行转义。尝试

    echo "a b [c] d" | sed 's/\] .*$/\] XYZ/'
    a b [c] XYZ

    请注意,因为没有打开 [ char 表示 char-class def,你可以逃脱
    echo "a b [c] d" | sed 's/] .*$/] XYZ/'
    a b [c] XYZ

    编辑

    只修复第 4 个字,
    echo "a b [c] d e" | sed 's/\] [^ ][^ ]*/\] XYZ/'
    a b [c] XYZ e

    从上面添加 [^ ][^ ]/说“any-char-that-is-not-a-space”后跟任意数量的“any-char-that-is-not-a-space”,所以当匹配器发现下一个空格时停止匹配。

    最终编辑
    echo "penguin bird [lives in Antarctica] The penguin lives in cold places.
    wold dog [lives in Antarctica with penguins] The wolf likes to eat penguins." \
    | sed 's/\] The penguin \(.*$\)/] The animal \1/'

    并且当您使用 gnu sed 时,您不需要逃避 (... ) 捕获括号。
    echo "penguin bird [lives in Antarctica] The penguin lives in cold places.
    wold dog [lives in Antarctica with penguins] The wolf likes to eat penguins." \
    | sed 's/\] The penguin (*$)/] The animal \1/'

    输出
    penguin bird [lives in Antarctica] The animal lives in cold places.
    wolf dog [lives in Antarctica with penguins] The wolf likes to eat penguins.

    取决于您使用的 sed 版本。 sed之间有相当大的差异为 AIX , 对比 solaris , VS GNU seds 通常可以在 lunix 中找到。

    如果您对使用 sed 有其他疑问,通常包含 sed --version 的输出会有所帮助。 , 或 sed -V .如果这些命令没有响应,请尝试 what sed .否则包括 uname 的操作系统名称.

    IHTH

    关于csv - 如何限制 sed 仅替换出现在第一个右方括号之后的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12451587/

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