我需要用两个字符串分隔一行,并用空格分隔,例如: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