如何将字符串拆分为变量/参数以传递给另一个脚本?

时间:2015-01-05 20:23:10

标签: string bash awk tokenize

我有一个文件列表(带有完整路径),我需要将其拆分为令牌,以便能够传递给另一个脚本/命令。看看字符串的样式,我认为awk是正确使用的工具,但我似乎无法弄清楚如何执行此操作,因为令牌的数量因行而异。

给定文件名./some/path/to/artifact_name/v1.2.3/filename.jar,我需要能够提取以下内容:

  • filename - 最终/:filename.jar
  • 后面的字符串
  • version - 文件名后面的/字符串后面的字符串: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是正确的工具吗?有更好/更容易使用的东西吗?

3 个答案:

答案 0 :(得分:1)

您可以使用awk或perl打印所有组件并将其导入read以将它们分配给不同的变量名称,或者多次使用不太优雅的命令dirnamebasename逐个获取组件,将它们立即存储到变量中,您可以将这些变量用作调用其他脚本的参数。取决于你的喜好。

#!/bin/bash

p="$1"
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个参数可以传递给你喜欢的任何颜色。

答案 1 :(得分:1)

使用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, $0 }' 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 " " $0) }' file

答案 2 :(得分:0)

使用

#!/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