用于批量替换.csv文件中特定字符串的shell脚本
我想替换原始csv文件中的一些字符串以供进一步使用,目前为止,我正在搜索internet并创建脚本。但它们似乎不起作用。希望有人能帮助我 csv文件是这样的,我想删除“^M”和“#列:”以便读取我的文件用于批量替换.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
# 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~ {} +