首页 > 解决方案 > 用于批量替换 .csv 文件中的特定字符串的 shell 脚本

问题描述

我想替换原始 csv 文件中的一些字符串以供进一步使用,我搜索互联网并创建脚本到目前为止。但似乎它们不起作用。希望任何人都可以帮助我

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

# 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
}

标签: shellbatch-processing

解决方案


你的整个脚本看起来就像:

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

脚本注释:

    vi ${cur_dir}/${dirlist} << EOF
    :%s/\r//g
    :%s/\#\ Columns:\ //g
    :wq
EOF
#^^ no spaces in front of EOF, also no spaces/tabs after EOF
# the whole line needs to be exactly 'EOF'

前面不能有任何空格、制表符。另外,我认为vi这不是在文件上运行替换的最佳工具,我也不知道它如何处理:. 您可能想尝试在没有空格字符的情况下运行它:

    vi ${cur_dir}/${dirlist} << EOF
:%s/\r//g
:%s/\#\ Columns:\ //g
:wq
EOF
  • 反引号 ` 已弃用,可读性较差,并且不允许轻松嵌套。请改用$( ... )命令替换。
  • echo `pwd` 只是无效使用 echo,只需使用pwd.
  • for dirlist in $(ls 解析 ls 输出是错误的。改用find命令,或者如果必须,使用 shell globulation,即。for dirlist in *.
  • if [ ${workdir}="/" ]是无效的。这将测试字符串"${workdir}=/是否不为空。Bash 是空间感知的,它需要=和操作数之间的空格。应该是if [ "${workdir}" = "/" ]
  • 总是引用你的变量。不做cd ${dirlist}cd "${dirlist}"类的。

推荐阅读