我有文件名列表file1,file2,file3
我想在脚本中传递这些文件名并删除特殊字符
我准备了sed命令来删除特殊字符
sed -i -e 's/^B/,/g' /home/data/nfiledata/
hdfs dfs -put -f /home/data/nfiledata/* user/sai/table1/nfiledata/
gzip /home/data/nfiledata/*
sed -i -e 's/^B/,/g' /home/data/marginfile/
hdfs dfs -put -f /home/data/marginfile/* user/sai/table2/marginfile/
gzip /home/data/marginfile/*
sed -i -e 's/^B/,/g' /home/data/calldata/
hdfs dfs -put -f /home/data/calldata/* user/sai/table3/calldata/
gzip /home/data/calldata/*
我的问题是,不是多次写同一个命令,我可以在一个命令中编写并使用Shell脚本循环每个文件的进程
nfile = (nfiledata,margindata, calldata)
while IFS= read -r nfile
do
sed -i -e 's//,/g' /home/data/$nfile/
hdfs dfs -put -f /home/data/$nfile/* user/sai/table$/$nfile/
gzip /home/data/$nfile/*
done < "home/data/$nfile"
答案 0 :(得分:1)
可以通过一次调用将相同的sed
命令应用于编辑多个文件:
sed -i -e 's/old/new/g' /home/data/file1 /home/data/file2 /home/data/file3
另外,如果文件名确实那么简单,那么可以使用大括号扩展:
sed -i -e 's/old/new/g' /home/data/file{1..3}
或者,
sed -i -e 's/old/new/g' /home/data/file[123]
或者,如果没有其他类似命名的文件要排除,路径名扩展可能就足够了:
sed -i -e 's/old/new/g' /home/data/file?
sed -i -e 's/old/new/g' nfile_dat fileidentifier margindata calldata
答案 1 :(得分:1)
for
循环,而非while read
循环,此处适用:
nfile=(file1 file2 file3)
for f in "${nfile[@]}"; do
sed -i -e 's/^B/,/g' /home/data/"$f"/ # should this be "$f"/* ?
hdfs dfs -put -f /home/data/"$f"/* user/sai/table1/"$f"/
gzip /home/data/"$f"/*
done
值得注意的组成部分:
=
周围留出空格。逗号不是bash中数组语法的一部分 - 未引用的,未转义的空格在其他地方充当分隔符。$f
之类的扩展必须在双引号内才能安全执行(没有字符串拆分或通配)。*
,必须在引号之外才能兑现。