我正在使用下面的命令来修改文件的内容,但我想在我试图修改的同一个文件中重写这个命令的输出。谁能帮忙。
cat file.csv | tr -d " \t\n\r" | tr '|' '\n' |sed "s/.$//" > file.csv
输入数据:
330000, 200000, , , xbdcb, rrrrrr, N,
N, 2018-06-14,N,|,
330000, 200000, , , xbdcb, rrrrrr, N,
N, 2018-06-14,N,|,
330000, 200000, , , xbdcb, rrrrrr, N,
N, 2018-06-14,N,|,
330000, 200000, , , xbdcb, rrrrrr, N,
N, 2018-06-14,N,|,
预期输出:
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
最佳答案
使用当前命令的快速和肮脏的技巧:
(cat file.csv | tr -d ' \t\n\r' | tr '|' '\n' |sed "s/.$//" > file2.csv && mv file2.csv file.csv)
解释:
将 && mv file2.csv file csv
添加到您的命令将在且仅当第一个命令成功完成时触发移动操作。
话虽这么说,你当前的命令应该被简化!!!示例:当您可以重定向 stdin
cat
和 pipe
(tr -d ' \t\n\r' < file.csv | tr '|' '\n' |sed "s/.$//" > file2.csv && mv file2.csv file.csv)
在编辑之后让我向您介绍一个内联命令,它将直接修改文件而不创建任何中间文件,为此我使用 sed
输入:
$ more file.csv
330000, 200000, , , xbdcb, rrrrrr, N,
N, 2018-06-14,N,|,
330000, 200000, , , xbdcb, rrrrrr, N,
N, 2018-06-14,N,|,
330000, 200000, , , xbdcb, rrrrrr, N,
N, 2018-06-14,N,|,
330000, 200000, , , xbdcb, rrrrrr, N,
N, 2018-06-14,N,|,
命令:
$ sed -n -i.bak 'h;n;H;n;x;s/[\n ]//g;s/,|,$//;p' file.csv
编辑后的文件:
$ more file.csv
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
解释:
-n
选项用于禁止sed默认打印-i.bak
是在线修改文件并备份.bak
文件,如果您确定要做什么,请将此更改为-i
, sed 会直接修改文件而不做任何备份h;n;
->h
将当前行的内容存入hold buffer并转到下一行n
H;n;
->H
将当前行附加到保持缓冲区并转到下一行x;
交换模式缓冲区和保持缓冲区以执行修改和打印s/[\n ]//g
从模式缓冲区中删除所有空格和 EOLs/,|,$//
去掉行尾的,|,
p
打印模式缓冲区
最后但并非最不重要的一点是,如果您在示例中显示的空行更多,请使用:
$ sed -n -i.bak '/^ *$/!{h;n;H;x;s/[\n ]//g;s/,|,$//;p}' file.csv
关于linux - 如何在unix中修改同一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50791104/