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
解决方案仅适用于GNUsed
。我想要一个更便携的sed
解决方案(例如,对于BSD/macOSsed
、Busyboxsed
)。以下解决方案使用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'