我想取代我的原始CSV文件中的一些字符串,以供进一步使用,我搜索互联网和创建脚本到目前为止。但似乎它们不起作用。希望有人能帮助我
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
function scandir(){
cd `dirname $0`
echo `pwd`
local cur_dir parent_dir workir
workdir=$1
cd ${workdir}
if [ ${workdir}="/" ]
then
cur_dir=""
else
cur_dir=$(pwd)
fi
for dirlist in $(ls ${cur_dir})
do
if test -d ${dirlist}
then
cd ${dirlist}
scandir ${cur_dir}/${dirlist}
cd ..
else
vi ${cur_dir}/${dirlist} << EOF
:%s/\r//g
:%s/\#\ Columns:\ //g
:wq
EOF
fi
done
}
4条答案
按热度按时间v1l68za41#
你的整个脚本看起来就像:
注意你的脚本:
<< EOF
文档无效。结束词EOF
* 必须 * 从脚本中的行首开始:不能有任何空格,制表符在它的前面。此外,我不认为
vi
不是在文件上运行替换的最佳工具,我也不知道它如何处理:
前面的制表符或空格。您可能想尝试在:
前面没有空格字符的情况下运行它:$( ... )
命令替代。pwd
只是echo的无效使用,只需使用pwd
。for dirlist in $(ls
parsing ls output is bad。使用find
命令代替,或者如果必须的话,shell globulation,即。for dirlist in *
。if [ ${workdir}="/" ]
无效。这测试字符串"${workdir}=/
是否不为null。Bash是空间感知的,它需要在=
和操作数之间有一个空格。应该是if [ "${workdir}" = "/" ]
。cd ${dirlist}
做cd "${dirlist}"
等等。aij0ehis2#
好张贴的答案是正确的,但我会推荐这种语法:
+
而不是\;
将允许sed
一次处理许多文件,减少分叉并使整个作业更快。-i
后的~
选项将重命名现有文件,方法是在名称末尾附加波浪号,而不是删除它们。-type f
将确保只处理文件(没有符号链接,目录,套接字,FIFO,设备...)hm2xizp93#
您可以将整个脚本缩减为一个命令,并且不必使用Vim来处理文件:
说明:
find <dir> -name <pattern> -exec <command> \;
将在每个文件上搜索<dir> for files matching
and execute
`。你想搜索CSV文件并对它们执行一些操作(对它们运行命令)。sed -i -e 's/\r$//; /^#/d'
。这意味着就地编辑文件(-i
)并对它们运行两个转换。s/\r$//
将删除每行中的^M
,/^#/d
将删除所有以#
开头的行。'{}'
被find
找到的文件替换,\;
标记find
运行的命令结束(参见find
手册页)。大多数脚本都模拟
find
命令的一部分。这不是个好主意此外,对于简单的文本处理,使用
sed
而不是调用诸如Vim之类的编辑器更容易、更快。ojsjcaue4#
对我来说,这是可行的:
我想用“something”代替“some string”。所以我使用这个命令来替换csv文件中的文本。