awk/sed 使用逐行文件操作时出错

awk/sed 使用逐行文件操作时出错

我需要" 1"在文件的每一行末尾附加字符串。执行以下两个命令后,将创建一个空文件。

awk '{ print $0 " 1" }' < file.txt > file.txt 

使用sed

sed 's/$/ 1/' file.txt > file.txt

这里尝试的错误是什么,你能指教吗?我正在 mac 终端中执行这些命令。

答案1

GNUsed解决方案需要-i内联编辑:

sed -i 's/$/ 1/' file.txt

(对于 BSD sed,你需要sed -i ''

在 中awk,您必须使用临时文件来解决这个问题:

awk '{ print $0 " 1" }' file.txt > tmp && mv tmp file.txt

事实上,sed还创建了一个临时文件,但-i处理该文件

问题在于awk '{ print $0 " 1" }' < file.txt > file.txt

重定向是在awk获得控制权之前执行的。> file.txt将截断文件。在终端中尝试:

>file

file即使文件之前有内容,大小也将为零。因此awk没有数据可从该文件中读取。这与 是同样的问题sed

\r带换行符的最终解决方案:

perl -pi -e 's/\r\n|\n|\r/ 1\n/g' file.txt

相关内容