如何创建 sed 脚本来替换文件中的引号?

如何创建 sed 脚本来替换文件中的引号?

因此,我在数据文件上连续手动使用以下两个命令,即在第一个命令完成更新文件后触发第二个命令:

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 脚本只是您需要执行的一堆命令手动运行,而是将这些命令全部自动化执行。

相关内容