读

我需要用两个字符串分隔一行,并用空格分隔,例如:key value

我试过了:

key=$(awk -FS=" " {print $1} line)
value=$(awk -FS=" " {print $2} line)

但我得到:

awk:第 2 行:文件末尾附近缺少 }

有任何想法吗?

答案1

awk命令行上的脚本应该用单引号引起来:

awk -F ' ' '{ print $1 }' filename

请注意 周围的单引号{ ... },并且正确的设置方法FS是 through -F、 through-v FS=...或 在BEGIN块中,但不是 with -FS=...

您的命令,您编写的方式,也假定它line是一个文件名。


如果$line是一个字符串,其中只有一个空格,则可以将其分成两个字符串

first_part=${line% *}   # removes the space and everything after it
second_part=${line#* }  # removes the space and everything before it

同样,if是一个其中$line包含 a 的字符串:=

first_part=${line%=*}   # removes the = and everything after it
second_part=${line#*=}  # removes the = and everything before it

答案2

您还可以使用数组在空格上分割行:

如果线是一个string

  arr=($line)
  key="${arr[0]}"
  value="${arr[1]}"

注意:- 如果 $line 的第一个单词是 *,则 arr 数组将包含当前目录中的所有文件名。因此,为了安全起见并避免出现此类情况,请使用

set -f; arr=($line); set +f key="${arr[0]}" value="${arr[1]}"

如果线file

while read -r words
do
  set -- $words
  key=$1
  value=$2
done < line

答案3

只需使用read

read key value

该行第一个空格之前的所有内容都进入key,其后的所有内容(包括任何其他空格)都进入value

答案4

您可以使用 shell 的参数扩展功能,而不是调用外部程序:

key=${line%% *}     # from the end remove the longest string matching
                    # a space followed by any characters

value=${line#* }    # from the start remove the shortest string matching
                    # any characters followed by a space

相关内容