gpt4 book ai didi

regex - 将不同的正则表达式可能性合并为一个

转载 作者:行者123 更新时间:2023-12-04 00:52:48 26 4
gpt4 key购买 nike

是否可以将以下正则表达式合二为一?

cat file.txt | \ 
sed 's/\tNULL\t/\t\\N\t/g' | \
sed 's/^NULL\t/\\N\t/g' | \
sed 's/\tNULL$/\t\\N/g' | \
sed 's/^NULL$/\\N/g''

也许还要补充一点,每月处理超过数十亿行,因此性能是一个考虑因素。

解决方案基准谢谢大家的建议,perl 对我来说运行最快。如果您想知道:

[/tmp]$ time cat /tmp/result_w_null.txt > /dev/null
real 0m0.045s
user 0m0.000s
sys 0m0.042s
[/tmp]$ time cat /tmp/result_w_null.txt | sed 's/\<NULL\>/\\N/g' > /dev/null
real 0m5.843s
user 0m2.472s
sys 0m3.852s
[/tmp]$ time cat /tmp/result_w_null.txt | sed 's/\tNULL\t/\t\\N\t/g' | sed 's/^NULL\t/\\N\t/g' | sed 's/\tNULL$/\t\\N/g' | sed 's/^NULL$/\\N/g' > /dev/null
real 0m7.078s
user 0m7.148s
sys 0m4.963s

#Suggestions:
[/tmp]$ time cat /tmp/result_w_null.txt | awk -F'\t' -v OFS='\t' '{for (i=1;i<=NF;i++) if ($i=="NULL") $i="\\N"}1' > /dev/null
real 0m20.196s
user 0m14.876s
sys 0m7.145s
[/tmp]$ time cat /tmp/result_w_null.txt | awk -v RS='(^|[\t\n])NULL(\tNULL)*([\t\n]|$)' '{ gsub(/NULL/, "\\N", RT); ORS=RT} 1' > /dev/null
real 0m10.611s
user 0m8.743s
sys 0m3.754s
[/tmp]$ time cat /tmp/result_w_null.txt | sed -E ':a; s/(\t|^)NULL(\t|$)/\1\\N\2/g; ta' > /dev/null
real 0m9.673s
user 0m5.723s
sys 0m5.678s
[/tmp]$ time cat /tmp/result_w_null.txt | perl -pe 's/(?:\t|^)\KNULL(?=\t|$)/\\N/g' > /dev/null
real 0m4.452s
user 0m3.237s
sys 0m2.288s

最佳答案

你可以使用

sed -E 's/(\t|^)NULL(\t|$)/\1\\N\2/g;'

如果可以连续匹配

sed -E ':a; s/(\t|^)NULL(\t|$)/\1\\N\2/g; ta'

查看 online demo .

POSIX ERE 正则表达式匹配

  • (\t|^) - 捕获第 1 组(替换模式中的 \1):制表符或字符串开头
  • NULL - 文字字符串
  • (\t|$) - 捕获第 2 组(替换模式中的 \2):制表符或字符串结尾。

对于连续的匹配,你需要循环匹配,通过设置一个标签(:a)然后使用ta分支到它。这是一种解决缺乏前瞻性支持的方法,前瞻性支持允许在不使用 的情况下检查尾随选项卡。在 Perl 中,您将使用

perl -pe 's/(?:\t|^)\KNULL(?=\t|$)/\\N/g'

在哪里

  • (?:\t|^) - 匹配制表符或字符串开头的非捕获组
  • \K - 匹配重置运算符,丢弃到目前为止匹配的所有文本
  • NULL - 文字字符串
  • (?=\t|$) - 一个积极的前瞻,需要一个制表符或字符串的结尾紧接在当前位置的右侧。

关于regex - 将不同的正则表达式可能性合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65182800/

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