shell - 用于批量替换 .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
}
解决方案
你的整个脚本看起来就像:
find "$workdir" -type f | xargs -n1 sed -i -e 's/\r//g; s/^# Columns://'
脚本注释:
- 在https://www.shellcheck.net/上检查您的脚本的有效性
- 此处的
<< EOF
文档无效。结束词EOF
必须从脚本内的行首开始:
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}"
类的。
推荐阅读
- ionic-framework - WebRTC 通话后 WhatsApp 语音消息不起作用
- r - 在 ggplot2 中使用气泡换条 (geom_point) 创建条形图
- c - C上的简单收银机程序
- javascript - 如何在具有多个变量的模板文字中使用三元运算符
- google-chrome-extension - 如何从 Chrome 扩展程序向 api 发出 http 请求
- scala - 需要从案例类的特征中引用伴随对象的特征
- android - 跟踪用户观看视频 android exoplayer 的时长
- javascript - 如何将数组中的多组重复整数分组到自己的数组中?
- python - 什么是使用 Python 在包含数百万个条目的 csv 文件中查找重复项的有效方法?
- javascript - 从 Firebase Cloud Storage 导入 Firestore 文档