Bash AWK变量替换

时间:2018-05-04 02:38:12

标签: bash awk

我正在尝试从其他变量中读取其中包含一些文本的内容:

index:index.html:index2.html:index3.html

我希望变量“a”一次等于每个“index.html”,这样我就可以在变量a上运行另一个命令,但是当awk命令递增时,变量a只是空白。以下是我的代码

index="index:index.html:index2.html:index3.html"
counter=4
a=$(echo $index | awk -F: '{for(i=3;i<$counter;i++){printf $i}}')

3 个答案:

答案 0 :(得分:0)

这应该这样做。将变量counter传递给awk,使用print代替printf,将a变量设为数组

index="index:index.html:index2.html:index3.html"
counter=4
a=( $(echo "$index" | awk -F: -v counter=$counter '{for(i=1;i<counter;i++){print $i}}') )
echo "${a[*]}"

结果

index index.html index2.html

答案 1 :(得分:0)

您的awk程序存在一些错误,但如果您仅使用awk拆分文件名,那么如果不使用{{1}则会更简单}。像这两个解决方案:

一次一个文件:

awk

使用数组

OLD_IFS="$IFS"
IFS=:

index="index:index.html:index2.html:index3.html"
for a in $index
do
    # here whatever you want to do with $a
    echo "Value of a is '$a'"
done

IFS="$OLD_IFS"

两种解决方案都具有相同的输出:

OLD_IFS="$IFS"
IFS=:

index="index:index.html:index2.html:index3.html"
array=( $index )
for a in "${array[@]}"
do
    # here whatever you want to do with $a
    echo "Value of a is '$a'"
done

IFS="$OLD_IFS"

答案 2 :(得分:0)

通过询问如何使用特定工具(awk)实现此,您可能会问XY Problem

我认为你可以完全避免使用awk,只需处理bash中的所有内容。

$ index="index:index.html:index2.html:index3.html"
$ IFS=:
$ declare a=( $index )
$ printf '%d\n' "${#a[@]}"     # here's your field count...
4
$ declare -p a
declare -a a=([0]="index" [1]="index.html" [2]="index2.html" [3]="index3.html")
$ printf '> %s\n' "${a[@]}"
> index
> index.html
> index2.html
> index3.html

或者如果你想说在这个数组的每个元素上运行另一个命令,你可以在数组元素上使用for循环:

$ for file in "${a[@]}"; do printf '>> %s\n' "$file"; done
>> index
>> index.html
>> index2.html
>> index3.html