我们如何使用Shell脚本删除空间?

时间:2018-10-04 20:42:22

标签: bash shell

我做了一个脚本,以便在不同情况下显示不同的内容。 脚本是:

#!/usr/bin/env bash

# declare an array, to store stuff in
declare -a myArray
shopt -s nocasematch

# read the full file into the array
# This while loop terminates when pressing CTRL-D
i=1
while read -r line; do
   myArray[i]="${line}"
   ((i++))   
done < /dev/stdin

# Process the array
for ((j=1;j<i;++j)); do
   # perform your actions here on myArray[j]

    case "${myArray[j]}" in
    bob)
        echo  "boy"
        ;;
    alicia)
        echo "girl" 
        ;;
    cookie)
        echo "dog" 
        ;;
    *)
        echo "unknown" "${myArray[j]}"
        ;;

    esac

done

但是当我使用以下命令执行代码时,我遇到了问题:

cat input.txt | ./prog.sh > file.txt

我有以下输入内容:

bob
alicia
amhed
cookie


daniel

在此输入中,我有足够的空间,但是当我运行程序时,却没有得到正确的结果。我需要我的代码不要考虑空格,但是如果照顾到空格,它会在OUTPOUT file.txt上写为“ unknown”。

我得到结果:

boy
girl
unknown amhed
dog
unknown 
unknown 
unknown daniel

那么我可以在不触摸输入文件的情况下消除/删除空格吗?

3 个答案:

答案 0 :(得分:1)

为什么在bash中这样做?

awk

$ awk 'BEGIN{n=split("bob boy alicia girl cookie dog",x);   
             for(i=1;i<n;i+=2) a[x[i]]=x[i+1]}              # build the lookup table

            {print $1 in a?a[$1]:"unknown "$1}' file

boy
girl
unknown amhed
dog
unknown 
unknown 
unknown daniel

您也可以将查找映射外部化到另一个文件,这样,如果其中一个值发生更改,则无需修改代码。

答案 1 :(得分:1)

如果在输入行为空时不执行任何操作,可以将其添加到case

#!/usr/bin/env bash

# declare an array, to store stuff in
declare -a myArray
shopt -s nocasematch

# read the full file into the array
# This while loop terminates when pressing CTRL-D
i=1
while read -r line; do
   myArray[i]="${line}"
   ((i++))
done < /dev/stdin

# Process the array
for ((j=1;j<i;++j)); do
   # perform your actions here on myArray[j]

    case "${myArray[j]}" in
    "") # This is an empty line, skip it
        ;;
    bob)
        echo  "boy"
        ;;
    alicia)
        echo "girl"
        ;;
    cookie)
        echo "dog"
        ;;
    *)
        echo "unknown" "${myArray[j]}"
        ;;

    esac

done

或者,在将其添加到数组之前,请检查所读取的行是否为空。

答案 2 :(得分:0)

  • 您可以从stdin中读取并处理每一行,并避免创建数组。
  • 使用&& [[ -n $line ]]确保只处理非空行。
  • 默认情况下,read命令从/dev/stdin读取它,因此您可以从代码中省略< /dev/stdin

代码:

shopt -s nocasematch

while read -r line && [[ -n $line ]]; do

    case "$line" in
    bob)
        echo  "boy"
        ;;
    alicia)
        echo "girl"
        ;;
    cookie)
        echo "dog"
        ;;
    *)
        echo "unknown $line"
        ;;
    esac

done

运行为:

./prog.sh < input.txt

输出:

boy
girl
unknown amhed
dog