linux - 如何在unix中修改同一个文件?

标签 linux file csv unix command

我正在使用下面的命令来修改文件的内容,但我想在我试图修改的同一个文件中重写这个命令的输出。谁能帮忙。

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

时,避免使用 catpipe
(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 从模式缓冲区中删除所有空格和 EOL
  • s/,|,$// 去掉行尾的,|,
  • 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/

相关文章:

c++ - 跨平台 svn 管理(Makefiles & Visual Studio)

regex - 使用正则表达式在 linux 中重命名文件

javascript - 为什么 fs.writeFileSync() 会抛出 "is not a function"错误?

python - Firestore不导入Blob而是导入字符串值

python - 如何判断 csv 文件中经过的小时数?

linux - 在脚本中正确使用 ps2pdf?

c - 为电子书阅读器设备编写软件

c++ - 将文本和行添加到文件的开头

java - file.encoding 无效,LC_ALL 环境变量起作用

ruby - 如果写入 CSV 文件时不存在子目录,如何创建子目录?