因此,我在数据文件上连续手动使用以下两个命令,即在第一个命令完成更新文件后触发第二个命令:
sed -i 's/""""/" " /g' EXPERIMENT-20210729010003.FILE
sed -i 's/"""/" " /g' EXPERIMENT-20210729010003.FILE
我怎样才能在 .sh 脚本中写入此内容并将文件名作为参数传递给 sh 调用?
EXPERIMENT-*.FILE 每天都会出现在我的 unix 服务器上。在任何给定时间点,只能有一个实验文件,其名称后附加有唯一的日期时间值。
谢谢!
答案1
您可以将两个单独的sed
命令合并为一个:
sed -i -e 's/""""/" " /g' -e 's/"""/" " /g' file
甚至,
sed -i 's/"\{3,4\}/" " /g' file
(但只是因为""""
正在被替换前 """
;如果您以相反的顺序进行替换,那么最后一个命令将不等效)。
你可以把它变成一个 shell 脚本,
#!/bin/sh
sed -i -e 's/""""/" " /g' -e 's/"""/" " /g' -- "$@"
...或进入 shell 函数(~.bashrc
例如在您的文件中),
call_sed () {
sed -i -e 's/""""/" " /g' -e 's/"""/" " /g' -- "$@"
}
命令中的--
停止命令行选项处理,并允许您对以破折号开头的文件名使用脚本或函数。将"$@"
扩展为给定脚本或函数的文件名列表,每个文件名都单独引用。
您可以像这样使用脚本或函数:
$ call_sed EXPERIMENT-*.FILE
使用这样的单个sed
命令,您甚至可以将其设为别名,但需要小心处理引用,我建议使用 shell 函数:
alias call_sed='sed -i -e "s/\"\"\"\"/\" \" /g" -e "s/\"\"\"/\" \" /g" --'
要使该-i
选项(您可能不想总是使用)成为脚本的选项:
#!/bin/sh
unset in_place
if [ "$1" = "-i" ]; then
in_place=true
shift
fi
sed ${in_place:+-i} -e 's/""""/" " /g' -e 's/"""/" " /g' -- "$@"
如果非空,则将${in_place:+-i}
扩展为。如果给脚本的第一个参数是,则该变量将非空。-i
$in_place
-i
可以对代码的 shell 函数变体进行完全相同的修改,以使 shell 函数采用选项-i
。
答案2
基本上你正在寻找的是:
#!/bin/bash
sed -i 's/""""/" " /g' $1
sed -i 's/"""/" " /g' $1
exit 0
假设您为脚本命名myscript.sh
。你会像这样使用它:
./myscript.sh filename.txt
是$1
传递给脚本的第一个参数,在本例中为filename.txt
。
所有 bash/shell 脚本只是您需要执行的一堆命令能手动运行,而是将这些命令全部自动化执行。