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