Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 一种查找字符串最长公共前缀的方法_Shell_Sed - Fatal编程技术网

Shell 一种查找字符串最长公共前缀的方法

Shell 一种查找字符串最长公共前缀的方法,shell,sed,Shell,Sed,中的sed解决方案仅适用于GNUsed。我想要一个更便携的sed解决方案(例如,对于BSD/macOSsed、Busyboxsed)。以下解决方案使用GNU-sed、macOS(10.15)sed和Busybox(v1.29)sed进行了测试 为了在有许多字符串时更高效,特别是在根本没有公共前缀的情况下(请注意与前面的解决方案不同的.*部分): 关于第一个解决方案中的$q 根据GNU sed手册(info sed): N最后一行的命令 当在文件的最后一行发出N命令时,大多数版本的sed将不打

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

以下解决方案使用GNU-sed、macOS(10.15)sed和Busybox(v1.29)sed进行了测试

为了在有许多字符串时更高效,特别是在根本没有公共前缀的情况下(请注意与前面的解决方案不同的
.*
部分):


关于第一个解决方案中的
$q
根据GNU sed手册(
info sed
):

  • N
    最后一行的命令

    当在文件的最后一行发出
    N
    命令时,大多数版本的
    sed
    将不打印任何内容而退出
    GNU sed
    在退出之前打印图案空间,当然,除非指定了
    -n
    命令开关


请注意,我没有使用
sed-E
,因为macOS sed的
-E
不支持
\N
s/pattern/replace/
命令的模式字符串中返回引用


更新(2021-04-26): 在另一个文件中找到此文件:

请注意,当只有一行时,它不起作用。可通过移除
1d
零件轻松固定:

sed -e '1h;G;s,\(.*\).*\n\1.*,\1,;h;$!d'
[STEP 104] $ printf '%s\n' a ab abc | sed -ne :loop -e '$p;N;s/^\(..*\).*\n\1.*/\1/;tloop' -e q
a
[STEP 105] $ printf '%s\n' a b c | sed -ne :loop -e '$p;N;s/^\(..*\).*\n\1.*/\1/;tloop' -e q
[STEP 106] $
[STEP 201] $ # with GNU sed:
[STEP 202] $ echo foofoo | gsed -E 's/(foo)\1/bar/'
bar
[STEP 203] $
[STEP 204] $ # with macOS's own sed:
[STEP 205] $ echo foofoo | sed -E 's/(foo)\1/bar/'
foofoo
[STEP 206] $
sed -e '1{h;d;}' -e 'G;s,\(.*\).*\n\1.*,\1,;h;$!d'
sed -e '1h;G;s,\(.*\).*\n\1.*,\1,;h;$!d'