Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用unix工具替换文件的最后一个或两个字符_Unix_File - Fatal编程技术网

如何用unix工具替换文件的最后一个或两个字符

如何用unix工具替换文件的最后一个或两个字符,unix,file,Unix,File,在一个文件的末尾有一个挂起的逗号,我想用一个方括号替换它。文件末尾可能有换行符,也可能没有。如何使用常用的unix工具将一个或两个字符替换为方括号?通常,文本文件应以换行符结尾 编辑文件以在最后一行用右括号替换尾随逗号的一种方法是: ed - $file <<'!' $s/,$/]/ w q ! 如果您已使用GNU,则有一个“覆盖”选项('-i',IIRC) 如果需要处理文件名而不是文件内容,则: newname=$(echo "$oldname" | sed 's/,$/]/')

在一个文件的末尾有一个挂起的逗号,我想用一个方括号替换它。文件末尾可能有换行符,也可能没有。如何使用常用的unix工具将一个或两个字符替换为方括号?

通常,文本文件应以换行符结尾

编辑文件以在最后一行用右括号替换尾随逗号的一种方法是:

ed - $file <<'!'
$s/,$/]/
w
q
!
如果您已使用GNU,则有一个“覆盖”选项('-i',IIRC)

如果需要处理文件名而不是文件内容,则:

newname=$(echo "$oldname" | sed 's/,$/]/')

毫无疑问,还有其他机制。您还可以使用Perl或Python;对于所请求的示例,它们倾向于过度使用。

Sed可以轻松地仅在最后一行进行替换:

sed '$ s/,/]/g' inputFile sed'$s/,/]/g'输入文件 $address选择器指示最后一行


但是,如果文件以换行符结尾,这不会改变这一点。这真的是您想要的行为,还是您只想用“]”替换最后一个?

这将删除所有尾随的空行,然后用“]”替换文件中的最后一个逗号

perl -i -pe'BEGIN{undef$/}s/,\n?\Z/]/'
cat origfile | sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' | sed -e '$s/,$/]/'  > outputfile 

假设最后一行不是换行符,与对大文件使用sed相比,这里有一个更快的方法

head -n -1 file > temp;
s=$(tail -1 file)
echo ${s/%,/]} >> temp
echo mv temp file

我想我可能没有正确理解
sed
。尾随的换行符不会导致$跳转到空行,在空行上找不到逗号并立即退出吗?不,
$
表示“最后一行”。最后一行可以以
\n
结尾(在UNIX中通常如此);这仍然是最后一行。谢谢,这正是我要找的。是的,你是对的,我真的不在乎是否有换行符,我只想替换逗号。谢谢该命令替换最后一行的所有逗号。如果只希望替换最后一个逗号,则应使用“
”$s/,$/]/”
。文件内容。。。对不起,乔纳森。没有看到你的问题。布莱恩,谢谢你的提问。在尝试之前,我没有意识到上面的建议将所有逗号替换为右方括号。你的第二份sed声明正是我想要的。嗯,嗯?马特的答案是唯一可能不正确的。
head -n -1 file > temp;
s=$(tail -1 file)
echo ${s/%,/]} >> temp
echo mv temp file