用于批量替换.csv文件中特定字符串的shell脚本

用于批量替换.csv文件中特定字符串的shell脚本,shell,batch-processing,Shell,Batch Processing,我想替换原始csv文件中的一些字符串以供进一步使用,目前为止,我正在搜索internet并创建脚本。但它们似乎不起作用。希望有人能帮助我 csv文件是这样的,我想删除“^M”和“#列:”以便读取我的文件 # Task: bending1^M # Frequency (Hz): 20^M # Clock (millisecond): 250^M # Duration (seconds): 120^M # Columns: time,avg_rss12,var_rss12,avg_rss13,var

我想替换原始csv文件中的一些字符串以供进一步使用,目前为止,我正在搜索internet并创建脚本。但它们似乎不起作用。希望有人能帮助我

csv文件是这样的,我想删除“^M”和“#列:”以便读取我的文件

# Task: bending1^M
# Frequency (Hz): 20^M
# Clock (millisecond): 250^M
# Duration (seconds): 120^M
# Columns: time,avg_rss12,var_rss12,avg_rss13,var_rss13,avg_rss23,var_rss23^M
#/usr/bin/env bash
函数scandir(){
cd`dirname$0`
echo`pwd`
本地当前目录父目录工作器
workdir=1美元
cd${workdir}
如果[${workdir}=“/”]
然后
cur_dir=“”
其他的
cur_dir=$(pwd)
fi
对于$中的目录列表(ls${cur_dir})
做
如果测试-d${dirlist}
然后
cd${dirlist}
scandir${cur_dir}/${dirlist}
光盘
其他的

vi${cur_dir}/${dirlist}您的整个脚本看起来就像:

find "$workdir" -type f | xargs -n1 sed -i -e 's/\r//g; s/^# Columns://'
脚本的注释:

  • 检查脚本在上的有效性

  • 您可以将整个脚本简化为一个命令,而不必使用Vim来处理文件:

    find ${workdir} -name '*.csv' -exec sed -i -e 's/\r$//; /^#/d' '{}' \;
    
    说明:

    • find-name-exec\;
      将搜索
      匹配的文件
      并对每个文件执行
      `操作。您希望搜索CSV文件并对其执行操作(对其运行命令)

    • 在找到的每个(CSV)文件上运行的命令将是
      sed-i-e的/\r$/;/^#/d'
      。这意味着要在位编辑文件(
      -i
      )并在它们上运行两个转换。
      s/\r$/
      将从每一行中删除
      ^M
      ,而
      /^d
      将删除所有以
      开头的行

    • '{}'
      替换为
      find
      找到的文件;
      \
      标记
      find
      运行的命令的结束(有关此信息,请参阅
      find
      手册页)

    大多数脚本都模拟了
    find
    命令的一部分。这不是一个好主意


    此外,对于简单的文本处理,使用
    sed
    而不是调用Vim之类的编辑器更容易、更快。

    正确的答案是正确的,但我建议使用以下语法:

    find "$1" -type f -name '*.csv' -exec sed -e 's/\r$//;s/^# Columns: //' -i~ {} +
    
    • 在find命令末尾使用
      +
      而不是
      \;
      将允许
      sed
      一次处理多个文件,从而减少分叉并使整个作业更快

    • ~
      之后的
      -i
      选项将重命名现有文件,方法是在名称末尾添加波浪号,而不是删除它们

    • 使用
      -类型f
      将确保仅处理文件(无符号链接、目录、套接字、FIFO、设备…)


    xargs
    不是必需的(
    find
    可以执行命令)太好了!请使用<代码> >模式/ D >代码> >!谢谢!!考虑一下<代码> >代码>结束标签>代码> ->代码>查找< <代码>命令,而不是<代码>;<代码> @ f.Huri是的,因为它只调用一次代码> SED < /C> >,所以稍微有效率。l文件;但是,我希望使示例尽可能简单,而不是使用更高级的功能。
    find ${workdir} -name '*.csv' -exec sed -i -e 's/\r$//; /^#/d' '{}' \;
    
    find "$1" -type f -name '*.csv' -exec sed -e 's/\r$//;s/^# Columns: //' -i~ {} +