打印文件而不添加带有awk的尾随换行符
我正在使用awk处理一些程序文件,删除调试部分。其中一些文件没有尾随换行符。我想让awk一行一行地打印文件,带有换行符,但如果文件不存在,就不要在末尾添加额外的换行符 例如 正在变成这样:打印文件而不添加带有awk的尾随换行符,awk,newline,cmp,Awk,Newline,Cmp,我正在使用awk处理一些程序文件,删除调试部分。其中一些文件没有尾随换行符。我想让awk一行一行地打印文件,带有换行符,但如果文件不存在,就不要在末尾添加额外的换行符 例如 正在变成这样: a b<NEWLINE> 我尝试用printf“%s”替换结尾处的print,$0。但是它会从每一行中省略一个换行符。您可以简单地使用这样一个事实,即awk在缺少换行符的情况下在末尾追加一个换行符,如下所示: { if ($0 ~ /^[ \t]*\/\/[ \t]*\/\*[
a
b<NEWLINE>
我尝试用
printf“%s”替换结尾处的print
,$0
。但是它会从每一行中省略一个换行符。您可以简单地使用这样一个事实,即awk
在缺少换行符的情况下在末尾追加一个换行符,如下所示:
{
if ($0 ~ /^[ \t]*\/\/[ \t]*\/\*[ \t]*begin[ \t]+debug[ \t]*$/) {
print "/* begin debug";
} else if ($0 ~ /^[ \t]*\/\/[ \t]*end[\ t]+debug[\t ]*\*\/[ \t]*$/) {
print "end debug */";
} else print;
}
# Let's say file1 does not contain a newline at the end. Since
# awk will add a newline at the end if it is missing, file1_debug
# WILL contain a newline at the end.
awk -f remove_debug.awk file1 > file1_debug
# Use awk again before comparing the files, this makes sure that when
# we compare them, both files have a newline at the end.
if cmp --silent <(awk '1' file1) <(awk '1' file1_debug) ; then
echo "The files are the same"
else
echo "The files differ"
fi
#假设file1结尾不包含换行符。自从
#如果缺少新行,awk将在末尾添加新行,file1\u debug
#将在末尾包含一个换行符。
awk-f remove_debug.awk file1>file1_debug
#在比较文件之前再次使用awk,这确保
#我们比较它们,两个文件的末尾都有一个换行符。
如果cmp--silent将打印行
语句更改为printf“%s%s”,行,RT
比如说
$ seq 3 > s3
$ head -c -1 s3 > s3nn # remove last newline
$ awk '$1=$1{printf "%s%s", $0, RT}' s3nn
1
2
3$ awk '$1=$1' s3nn
1
2
3
$ cat s3nn
1
2
3$
在您的情况下,没有参数的print
等于print$0
为什么?结尾没有换行符的源代码文件被认为是不好的做法。@hek2mgl我个人也希望看到结尾有换行符,但Windows工具并不真正在意。@TomFenech至少git会抱怨这一点,在Windows上也是如此。顺便说一句,在Linux上,即使生成一个结尾没有换行符的文件,也是一个相当棘手的问题。:)@hek2mgl我同意源代码文件的结尾应该有一个换行符,但是如果忘记了和/或我们没有转换它们,我希望脚本仍然有效。BBEdit(在OSX上)默认情况下不会在末尾插入换行符,所以我不会说它需要“hack”。但是,它确实有一个“确保文件以换行结束”设置,这可能已经被检查过了。如果GNU awk使用RT
输出与输入相同的终止符或缺少任何终止符RT
是一项仅限于gawk
的功能:很高兴知道有一种方法。太遗憾了,我没有使用GNU版本。谢谢,这是一个很好的解决方案。我试图用awk来解决这个问题,但从awk内部(标准)很难判断它是否以换行结束。
$ seq 3 > s3
$ head -c -1 s3 > s3nn # remove last newline
$ awk '$1=$1{printf "%s%s", $0, RT}' s3nn
1
2
3$ awk '$1=$1' s3nn
1
2
3
$ cat s3nn
1
2
3$