删除文件中最后一次出现的',' - 但不是整行

  • 本文关键字:删除 最后一次 文件 bash
  • 更新时间 :
  • 英文 :


如果我有一个包含这个的文件:

[
{[ ...,..., ]},
{[ ...,..., ]},
{[ ...,..., ]},
{[ ...,..., ]},
]

我想去掉最后一个逗号所以我得到:

[
{[ ...,..., ]},
{[ ...,..., ]},
{[ ...,..., ]},
{[ ...,..., ]}    <----- no comma
]

到目前为止,我找不到一个简单的方法来做到这一点-大多数解决方案删除整行或进行行搜索,这与我正在尝试的不匹配。我觉得这应该是sedawk命令。

rev file | sed -z 's/,//' | rev

将文件反转,删除零分隔流中的第一个逗号,因此整个文件中的第一个逗号,然后再次反转。

使用ed,它与sed不同,用于ed编辑文件,从而允许在文件中向后搜索:

printf "%sn" '?,$?s/,$//' w | ed -s file

将查找以逗号结尾的最后一行,并删除该逗号,然后保存文件。

我同意@Barmar在评论中的观点,尽管一个更好的解决方案是修复生成文件的任何东西,使其首先不包括末尾的逗号。

使用shell参数展开,对盲目地删除最后一个逗号:

contents=$(< file)
fixed=${contents%,*}${contents##*,}
echo "$fixed"

使用文本工具:反转文件,删除第一个行上的逗号,然后重新反转文件

tac file | awk '!p && /,$/ {sub(/,$/, ""); p = 1} 1' | tac

稍微不同一下,即使','不是该行的最后一个字符,也应该允许所需的输出。

查找包含逗号的最后一行并捕获行号:

line_no=$(grep -n ',' t.dat | tail -n 1 | cut -f1 -d:)

然后从该特定行的最后一个逗号中删除,无论它出现在哪里:

awk -v li="${line_no}" 'BEGIN{ FS=OFS="," } NR==li{ for(i=1; i<NF-1; i++). printf "%s", $i OFS; printf "%sn", $i "" $NF; next }1' t.dat

可以组合为:

awk -v li="$(grep -n ',' t.dat | tail -n 1 | cut -f1 -d:)" 'BEGIN{ FS=OFS="," } NR==li{ for(i=1; i<NF-1; i++) printf "%s", $i OFS; printf "%sn", $i "" $NF; next
}1' t.dat

t.dat内容:

[
{[ ...,..., ]},
{[ ...,..., ]},
{[ ...,..., ]},
{[ ...,..., ]},
]

过程t.dat:

$ awk -v li="$(grep -n ',' t.dat | tail -n 1 | cut -f1 -d:)" 'BEGIN{ FS=OFS="," }
NR==li{ for(i=1; i<NF-1; i++) printf "%s", $i OFS;
printf "%sn", $i "" $NF; next
}1' t.dat

输出:

[
{[ ...,..., ]},
{[ ...,..., ]},
{[ ...,..., ]},
{[ ...,..., ]}
]

如果整个文件以该块结束,则只执行

gawk FS  RS='[]][}],n[]]n' ORS=']}n]n'
nawk $$  RS='[]][}],n[]]n' ORS=']}n]n'
mawk //_ RS='[]][}],n[]]n' ORS=']}n]n'
[
{[ ...,..., ]},
{[ ...,..., ]},
{[ ...,..., ]},
{[ ...,..., ]}
]
awk '/,/ && ++count==1{gsub(/,$/,"")}1' <(tac file)|tac

最新更新