gpt4 book ai didi

sed - 如何将查找和替换限制为 CSV 中的一列?

转载 作者:行者123 更新时间:2023-12-04 23:31:55 35 4
gpt4 key购买 nike

我有一个 4 列的 CSV 文件,例如:

0001 @ fish @ animal @ eats worms

我使用 sed 对文件进行查找和替换,但我需要将此查找和替换限制为仅在第 3 列中找到的文本。

我怎样才能让查找和替换只发生在这一列上?

最佳答案

您确定要使用 sed 吗?怎么样csvfix ?您的 CSV 是否漂亮且简单,没有引号或嵌入逗号或其他使正则表达式变得令人讨厌的东西……处理一般 CSV 文件的方式不太令人满意?我假设 @ 是您格式中的“逗号”。

考虑使用 awk 而不是 sed:

awk -F@ '$3 ~ /pattern/ { OFS= "@"; $3 = "replace"; }'

可以说,您应该有一个设置 OFS 一次的 BEGIN block 。对于一行输入,它没有任何胜算(而且您可能也很难衡量一百万行输入的差异):

$ echo "pattern @ pattern @ pattern @ pattern" | 
> awk -F@ '$3 ~ /pattern/ { OFS= "@"; $3 = "replace"; }'
pattern @ pattern @replace@ pattern
$

如果 sed 看起来仍然很有吸引力,那么:

sed '/^\([^@]*@[^@]*\)@pattern@\(.*\)/ s//\1@replace@\2/'

例如(请注意输入和输出略有不同 - 如果需要,您可以修复它以处理与 awk 相当相同的操作):

$ echo "pattern@pattern@pattern@pattern" |
> sed '/^\([^@]*@[^@]*\)@pattern@\(.*\)/ s//\1@replace@\2/'
pattern@pattern@replace@pattern
$

第一个正则表达式查找一行的开头、一个非 at 符号字段、一个 at 符号、另一个非 at 符号字段并记住批处理;它寻找一个 at 符号、模式(它必须在第三个字段中,因为前两个字段已经匹配)、另一个 at 符号,然后是该行的剩余部分。当该行匹配时,它用前两个字段替换该行(根据需要未更改),然后添加替换的第三个字段,以及该行的剩余部分(未更改,根据需要)。

如果您需要编辑而不是简单地替换第三个字段,那么您可以考虑使用 awk 或 Perl 或 Python。如果您仍然受限于 sed,那么您可以探索使用保持空间来保持行的一部分,同时在模式空间中操作其他部分,并最终重新整合您想要的输出行打印行之前的保持空间和模式空间。这几乎和听起来一样困惑;实际上,可能比听起来更困惑。我会选择 Perl(因为我很久以前就学过它,它很容易做这类事情),但您可以使用任何您喜欢的非 sed 工具。


Perl 编辑第三个字段。请注意,默认输出是 $_,它必须从数组 @F 中的自动拆分字段重新组合。

$ echo "pattern@pattern@pattern@pattern" | sh -x xxx.pl
> perl -pa -F@ -e '$F[2] =~ s/\s*pat(\w\w)rn\s*/ prefix-$1-suffix /; $_ = join "@", @F; ' "$@"
pattern@pattern@ prefix-te-suffix @pattern
$

解释。 -p 表示“循环,将行读入 $_ 并打印 $_在每次迭代结束时'。 -a 表示“自动将 $_ 拆分为数组 @F”。 -F@ 表示字段分隔符是@-e 后面是 Perl 程序。在 Perl 中,数组从 0 开始索引,因此第三个字段被拆分为 $F[2](符号 — @$ —根据您使用的是数组中的值还是整个数组的值而变化。=~ 是匹配运算符;它将 RHS 上的正则表达式应用于 LHS 上的值。替换模式识别零个或多个空格 \s* 后跟 pat 然后是两个“单词”字符,它们被记住到 $1 中,然后是 rn 和零个或多个空格;也许那里应该有一个 ^$ 来绑定(bind)到字段的开始和结束。替换是一个空格,'prefix-',记住的字母对,'-suffix'和一个空格。 $_ = join "@", @F; 重新组合输入行 $_ 来自可能修改的单独字段,然后 -p 打印出来。不像我想要的那么整洁(所以可能有更好的 wa y 去做),但它有效。并且您可以在 Perl 中对任意字段进行任意转换而不会有太大困难。 Perl 还有一个模块 Text::CSV(和一个高速 C 版本,Text::CSV_XS)可以处理非常复杂的 CSV 文件。

关于sed - 如何将查找和替换限制为 CSV 中的一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10050753/

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