Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
打印字符串的所有前缀-从python转换为bash_Python_Bash - Fatal编程技术网

打印字符串的所有前缀-从python转换为bash

打印字符串的所有前缀-从python转换为bash,python,bash,Python,Bash,我有一个shell脚本,它需要取一个。所以并获取它的所有前缀,其中前缀是名称的一部分,直到”。所以“部分+下一部分直到” 示例:对于'Example.so.1'我们将有以下前缀:'Example.so','Example.so.1' 我有一个python(3)代码来实现这一点,我想得到一个bash等价物 Python源代码的Bash包装器: #!/bin/bash dst='/tmp' for src in 'example.so' 'example.so.1' 'example.so.1

我有一个shell脚本,它需要取一个
。所以
并获取它的所有前缀,其中前缀是名称的一部分,直到
”。所以“
部分+下一部分直到

示例:对于
'Example.so.1'
我们将有以下前缀:
'Example.so','Example.so.1'

我有一个python(3)代码来实现这一点,我想得到一个bash等价物


Python源代码的Bash包装器:

#!/bin/bash


dst='/tmp'
for src in 'example.so' 'example.so.1' 'example.so.1.2' 'example.so.1.2.3'; do
python3 -c "
import os, sys, itertools as it, re;
so_path = os.path.abspath(sys.argv[1]);
dst = sys.argv[2];
so = os.path.basename(so_path);
so_name = so.split('.')[0];
regex = '\.\w+';
for suffix in it.accumulate(re.findall(regex, so)):
    dst_so = os.path.join(dst, so_name + suffix)
    print('src: {}. dst: {}'.format(so_path, dst_so))
" "${src}" "${dst}";
done

这是我在bash中使用awk的试用(它还没有完成,只打印源代码。我一直在调整它,但无法让它完全按照我的要求执行):


实现这一目标的最佳方式是什么?(我猜是
awk
,不过我确实尝试过使用一些og
cut、sed等。


bash代码必须在干净的ubuntu18上运行,无需额外安装

看起来您应该能够在一个循环中进行刮胡子。
给定
f=example.so.1.2.3
,请尝试

$: while [[ "$f" =~ [.]so[.] ]]; do echo "$f"; f=${f%.*}; done; echo "$f"
example.so.1.2.3
example.so.1.2
example.so.1
example.so
如果您想先使用较小的,请将其通过排序

$: { while [[ "$f" =~ [.]so[.] ]]
>    do echo "$f"
>       f=${f%.*}
>    done
>    echo "$f"
>  } | sort
example.so
example.so.1
example.so.1.2
example.so.1.2.3

awk
中执行此操作。它与awk的比例将为1:1。@ClsForCookies:请查看
basename
。例如,
basename示例。因此.1
将示例写入stdout。如果您需要更大的灵活性,请查看bash手册页的标题参数扩展部分,特别是删除匹配的后缀模式部分。您很有可能布莱在寻找类似这样的东西,我试图让它像你的问题一样难以理解。@oguzismail非常感谢:)你能指出我问题中的问题所在吗,这样我就知道如何解决了?
$: { while [[ "$f" =~ [.]so[.] ]]
>    do echo "$f"
>       f=${f%.*}
>    done
>    echo "$f"
>  } | sort
example.so
example.so.1
example.so.1.2
example.so.1.2.3