如何将字符串拆分为 variables/parameters 以传递给另一个脚本?
How to split the string into variables/parameters to pass to another script?
我有一个文件列表(带有完整路径),我需要将其拆分为令牌以便能够传递给另一个 script/command。查看字符串的样式,我认为 awk 是正确的工具,但我似乎无法弄清楚如何做到这一点,因为标记的数量因行而异。
给定文件名 ./some/path/to/artifact_name/v1.2.3/filename.jar
,我需要能够提取以下内容:
- filename - 最后 / 后面的字符串:filename.jar
- 版本 - 文件名之后/之前的字符串:v1.2.3
- 工件名称 - 版本之后/之前的字符串:artifact_name
- 组名 - 路径的其余部分,所有 / 替换为 . : some.path.to
例如,给定:
./com/eric/ics/BillP/3.5.11/BillP-3.5.11.jar
- filename: BillP-3.5.11.jar
-version: 3.5.11
-artifact: BillP
-group: com.eric.ics
我最大的困难是代表该组的文件夹数量可能会发生变化。例如:./com/eric/some/other/pkg/BillP/3.5.11/BillP-3.5.11.jar
将同样有效,除了该组将是 com.eric.some.other.pkg
.
我的目标是在成功提取这 4 个参数后将它们传递给单独的脚本,但我似乎无法找出最简单的方法来执行此操作。 awk 是正确的工具吗?有什么东西可以用吗better/easier?
您可以使用 awk 或 perl 打印所有组件并将其通过管道传输到 read
以将它们分配给不同的变量名称,或者使用不太优雅的命令 dirname
和 basename
多次逐个获取组件,将它们立即存储到变量中,您可以将这些变量用作调用其他脚本的参数。看你喜欢什么。
#!/bin/bash
p=""
file="$(basename "$p")"
p="$(dirname "$p")"
version="$(basename "$p")"
p="$(dirname "$p")"
artifact="$(basename "$p")"
group="$(dirname "$p" | tr / . | sed 's+\.*++')"
echo file=$file version=$version artifact=$artifact group=$group
现在你在 4 个变量中有了这 4 个参数,你可以将它们传递给任何你喜欢的东西。
使用 gnu-awk:
awk -F/ -v OFS=. '{f=$NF;v=$(NF-1);a=$(NF-2); NF-=3; sub(/^[^[:alnum:]]+/, "");
printf "-filename: %s\n-version: %s\n-artifact: %s\n-group: %s\n\n", f, v, a, [=10=] }' file
-filename: BillP-3.5.11.jar
-version: 3.5.11
-artifact: BillP
-group: com.eric.ics
-filename: BillP-3.5.11.jar
-version: 3.5.11
-artifact: BillP
-group: com.eric.some.other.pkg
cat file
./com/eric/ics/BillP/3.5.11/BillP-3.5.11.jar
./com/eric/some/other/pkg/BillP/3.5.11/BillP-3.5.11.jar
编辑: 使用这些参数调用辅助脚本:
awk -F/ -v OFS=. '{f=$NF;v=$(NF-1);a=$(NF-2); NF-=3; sub(/^[^[:alnum:]]+/, "");
system("./script.sh " f " " v " " a " " [=11=]) }' file
使用perl:
#!/usr/bin/env perl
use strict; use warnings;
while (<DATA>) {
chomp;
my @list = split /\//;
print map { $_ . "\t" . pop(@list) . "\n" }
qw/-filename: -version: -artifact:/;
print "-group:\t\t", join(".", @list[1..$#list]), "\n\n";
}
__DATA__
./com/eric/ics/ccc/BillP/3.5.11/BillP-3.5.11.jar
./com/eric/ics/BillP/3.5.11/BillP-3.5.11.jar
./com/eric/ics/xxx/yyy/BillP/3.5.11/BillP-3.5.11.jar
输出:
-filename: BillP-3.5.11.jar
-version: 3.5.11
-artifact: BillP
-group: com.eric.ics.ccc
-filename: BillP-3.5.11.jar
-version: 3.5.11
-artifact: BillP
-group: com.eric.ics
-filename: BillP-3.5.11.jar
-version: 3.5.11
-artifact: BillP
-group: com.eric.ics.xxx.yyy
我有一个文件列表(带有完整路径),我需要将其拆分为令牌以便能够传递给另一个 script/command。查看字符串的样式,我认为 awk 是正确的工具,但我似乎无法弄清楚如何做到这一点,因为标记的数量因行而异。
给定文件名 ./some/path/to/artifact_name/v1.2.3/filename.jar
,我需要能够提取以下内容:
- filename - 最后 / 后面的字符串:filename.jar
- 版本 - 文件名之后/之前的字符串:v1.2.3
- 工件名称 - 版本之后/之前的字符串:artifact_name
- 组名 - 路径的其余部分,所有 / 替换为 . : some.path.to
例如,给定:
./com/eric/ics/BillP/3.5.11/BillP-3.5.11.jar
- filename: BillP-3.5.11.jar
-version: 3.5.11
-artifact: BillP
-group: com.eric.ics
我最大的困难是代表该组的文件夹数量可能会发生变化。例如:./com/eric/some/other/pkg/BillP/3.5.11/BillP-3.5.11.jar
将同样有效,除了该组将是 com.eric.some.other.pkg
.
我的目标是在成功提取这 4 个参数后将它们传递给单独的脚本,但我似乎无法找出最简单的方法来执行此操作。 awk 是正确的工具吗?有什么东西可以用吗better/easier?
您可以使用 awk 或 perl 打印所有组件并将其通过管道传输到 read
以将它们分配给不同的变量名称,或者使用不太优雅的命令 dirname
和 basename
多次逐个获取组件,将它们立即存储到变量中,您可以将这些变量用作调用其他脚本的参数。看你喜欢什么。
#!/bin/bash
p=""
file="$(basename "$p")"
p="$(dirname "$p")"
version="$(basename "$p")"
p="$(dirname "$p")"
artifact="$(basename "$p")"
group="$(dirname "$p" | tr / . | sed 's+\.*++')"
echo file=$file version=$version artifact=$artifact group=$group
现在你在 4 个变量中有了这 4 个参数,你可以将它们传递给任何你喜欢的东西。
使用 gnu-awk:
awk -F/ -v OFS=. '{f=$NF;v=$(NF-1);a=$(NF-2); NF-=3; sub(/^[^[:alnum:]]+/, "");
printf "-filename: %s\n-version: %s\n-artifact: %s\n-group: %s\n\n", f, v, a, [=10=] }' file
-filename: BillP-3.5.11.jar
-version: 3.5.11
-artifact: BillP
-group: com.eric.ics
-filename: BillP-3.5.11.jar
-version: 3.5.11
-artifact: BillP
-group: com.eric.some.other.pkg
cat file
./com/eric/ics/BillP/3.5.11/BillP-3.5.11.jar
./com/eric/some/other/pkg/BillP/3.5.11/BillP-3.5.11.jar
编辑: 使用这些参数调用辅助脚本:
awk -F/ -v OFS=. '{f=$NF;v=$(NF-1);a=$(NF-2); NF-=3; sub(/^[^[:alnum:]]+/, "");
system("./script.sh " f " " v " " a " " [=11=]) }' file
使用perl:
#!/usr/bin/env perl
use strict; use warnings;
while (<DATA>) {
chomp;
my @list = split /\//;
print map { $_ . "\t" . pop(@list) . "\n" }
qw/-filename: -version: -artifact:/;
print "-group:\t\t", join(".", @list[1..$#list]), "\n\n";
}
__DATA__
./com/eric/ics/ccc/BillP/3.5.11/BillP-3.5.11.jar
./com/eric/ics/BillP/3.5.11/BillP-3.5.11.jar
./com/eric/ics/xxx/yyy/BillP/3.5.11/BillP-3.5.11.jar
输出:
-filename: BillP-3.5.11.jar
-version: 3.5.11
-artifact: BillP
-group: com.eric.ics.ccc
-filename: BillP-3.5.11.jar
-version: 3.5.11
-artifact: BillP
-group: com.eric.ics
-filename: BillP-3.5.11.jar
-version: 3.5.11
-artifact: BillP
-group: com.eric.ics.xxx.yyy