gpt4 book ai didi

sed - 可移植的 sed 方法来查找字符串的最长公共(public)前缀

转载 作者:行者123 更新时间:2023-12-04 08:26:20 24 4
gpt4 key购买 nike

Longest common prefix of two strings in bash 中的 sed 解决方案仅适用于 GNU sed。我想要一个更便携的 sed 解决方案(例如,对于 BSD/macOS sed、Busybox sed)。

最佳答案

以下解决方案已使用 GNU sed、macOS (10.15) sed 和 busybox (v1.29) sed 进行测试。

$ printf '%s\n' a ab abc | sed -e '$q;N;s/^\(.*\).*\n\1.*$/\1/;h;G;D'
a
$ printf '%s\n' a b c | sed -e '$q;N;s/^\(.*\).*\n\1.*$/\1/;h;G;D'

$

当有很多字符串时,尤其是根本没有公共(public)前缀时,要提高效率(请注意 ..* 部分,这与之前的解决方案不同):

$ printf '%s\n' a ab abc | sed -ne :L -e '$p;N;s/^\(..*\).*\n\1.*/\1/;tL' -e q
a
$ printf '%s\n' a b c | sed -ne :L -e '$p;N;s/^\(..*\).*\n\1.*/\1/;tL' -e q
$

关于$q在第一个解决方案中

根据 GNU sed 手册 ( info sed ):

  • N command on the last line

    Most versions of sed exit without printing anything when the N command is issued on the last line of a file. GNU sed prints pattern space before exiting unless of course the -n command switch has been specified.


请注意,我没有使用 sed -E因为 macOS 的 sed -E不支持\N s/pattern/replace/ 中的反向引用命令的模式部分。

  • 使用 GNU sed:

    $ echo foofoo | gsed -E 's/(foo)\1/bar/'
    bar
  • 使用 macOS sed:

    $ echo foofoo | sed  -E 's/(foo)\1/bar/'
    foofoo

更新(2021-04-26):

在另一个 answer 中找到了这个:

sed -e '1{h;d;}' -e 'G;s/\(.*\).*\n\1.*/\1/;h;$!d'

请注意,当输入仅包含一行时,它不起作用。可以通过删除 1d 轻松修复部分:

sed -e '1h;G;s/^\(.*\).*\n\1.*/\1/;h;$!d'

关于sed - 可移植的 sed 方法来查找字符串的最长公共(public)前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65245764/

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