Bash 如何删除数组中最后一行末尾的逗号
我正在使用Bash 如何删除数组中最后一行末尾的逗号,bash,sed,Bash,Sed,我正在使用sed'$s/,$/'尝试删除数组最后一行末尾的逗号,该数组的行上有开始括号和结束括号(如下所示)。此命令sed'$s/,$/'未按预期工作 如果我这样做,sed'$s/]$/'它将删除结束数组括号,因此我知道我的思路是正确的 [ {"foo":"foofoo","fuzz":["fee, fi, fo, fum"]}, {"bar":"barbar","fuzz":["blah", "blah"]}, ] 这是一个bash脚本。请不要提供使用perl的答案。最后一行中没有逗号,因此
sed'$s/,$/'
尝试删除数组最后一行末尾的逗号,该数组的行上有开始括号和结束括号(如下所示)。此命令sed'$s/,$/'
未按预期工作
如果我这样做,sed'$s/]$/'
它将删除结束数组括号,因此我知道我的思路是正确的
[
{"foo":"foofoo","fuzz":["fee, fi, fo, fum"]},
{"bar":"barbar","fuzz":["blah", "blah"]},
]
这是一个bash脚本。请不要提供使用perl的答案。最后一行中没有逗号,因此
“$s/,$/”
将不适用于sed
您可以使用awk
,而不是sed
:
awk '$1 == "]"{sub(/,$/, "", s)} NR>1{print s} {s=$0} END{print s}' file
[
{"foo":"foofoo","fuzz":["fee, fi, fo, fum"]},
{"bar":"barbar","fuzz":["blah", "blah"]}
]
或者您可以使用以下perl
命令:
perl -0pe 's/,(\s\])/$1/' file
[
{"foo":"foofoo","fuzz":["fee, fi, fo, fum"]},
{"bar":"barbar","fuzz":["blah", "blah"]}
]
虽然您已经使用
awk
得到了答案,但请注意,使用bash提供的内置功能也可以完成同样的任务:
#!/bin/bash
[ -r "$1" ] || { ## validate filename given as argument
printf "error: file not readable. usage: %s filename\n" "${0##*/}"
exit 1
}
while read -r line; do
[ -z "$last" ] && { last="$line"; continue; } ## if last not set, continue
if [ "$line" == "]" ]; then ## if line "]", check last
[ ${last:(-1)} == ',' ] && last=${last%,} ## check for & remove comma
fi
[ -z "$last" ] || echo $last ## echo if $last set
last="$line"
done <"$1"
echo $last ## print final line
exit 0
这可能适用于您(GNU-sed):
阅读两行,当一个
,
出现在它们连接处的]
之前时,将其删除。您好,这里不使用perl。谢谢你。用bash,sed,awk做这个?这个问题没有perl标记(我认为这足以说明我不是在寻找perl的答案),但是如果没有,我很抱歉。谢谢。你能解释一下为什么需要用s
(字符串)执行所有这些s{print s}{s=$0}
(即在命令的这一部分中使用s
变量三次)吗?为了清楚起见,对它做了一些修改NR>1{print s}
仅为第二条记录以后的记录打印变量s
。对于第一条记录,我们将$0
存储在s
中。所以打印从第二条记录开始,这也是我们在END
块中打印的原因。如果输入是完全规则的,您可以将sub
也放在END
块中。这应该是有效的JSON吗?应该修复产生它的东西,以停止添加不正确的逗号。@chepner是的,它是。不知道该怎么做(另一个问题的主题…)这会从每行中删除尾随逗号,但目的是仅当下一行是]
时才删除尾随的。
。我没有搞错那一行。我会猛拉答案。如果数组中有两个以上的条目,这将从比上一行更多的行中删除逗号。
$ bash stripcomma.sh dat/endcomma.txt
[
{"foo":"foofoo","fuzz":["fee, fi, fo, fum"]},
{"bar":"barbar","fuzz":["blah", "blah"]}
]
awk 'NR>2{sub(/,$/,"")}1' file
[
{"foo":"foofoo","fuzz":["fee, fi, fo, fum"]},
{"bar":"barbar","fuzz":["blah", "blah"]}
]
sed -r 'N;s/,(\n])/\1/;P;D' file