我想使用 sed 命令的here-doc 并提供要读取的文件和输出文件。
我看过这里的文件来自高级 Bash 脚本指南,但它没有提及有关使用此处文档的常规参数的任何信息。有可能吗?
我想实现如下目标:
#!/bin/bash
OUT=/tmp/outfile.txt
IN=/my_in_file.txt
sed $IN << SED_SCRIPT
s/a/1/g
s/test/full/g
SED_SCRIPT
> $OUT;
非常感谢任何帮助。
答案1
您可以使用 告诉 GNU sed 从标准输入读取脚本-f -
,-f
这意味着从文件中读取脚本,并且-
意味着标准输入,这在许多命令中都很常见。
sed -f - "$IN" > "$OUT" << SED_SCRIPT
s/a/1/g
s/test/full/g
SED_SCRIPT
POSIX sed 也支持-f
,但标准输入的使用-
没有记录。在这种情况下,您可以/dev/stdin
在 Linux 系统上使用(我似乎记得 Solaris 也有这个,但我现在无法确认)
使用<<-SED_SCRIPT
(带有“-”前缀)将允许结束SED_SCRIPT
标记缩进。
答案2
如果sed
不支持从stdin
(使用-f -
,您可以使用流程替代(可在bash
、zsh
、中找到ksh93
):
sed "$IN" > "$OUT" -f <( cat << SED_SCRIPT
s/a/1/g
s/test/full/g
SED_SCRIPT)
右括号)
必须紧跟在结束分隔符 ( SEC_SCRIPT
) 后面或换行符之后。在流程替换的情况下,您还可以使用echo
此处的文档来代替:
sed "$IN" > "$OUT" -f <( echo \
" s/a/1/g
s/test/full/g" )
答案3
为什么不使用多个表达式,-e
如下所示:
#!/bin/bash
OUT=/tmp/outfile.txt
IN=/my_in_file.txt
sed
-e "s/a/1/g" \
-e "s/test/full/g" \
$IN > $OUT
我发现对于较小的内联 sed 脚本来说更具可读性。顺便说一句,您还可以使用 sed 的就地编辑:
sed -i.org
-e "s/a/1/g" \
-e "s/test/full/g" \
$IN
这会将原始文件保存在输入文件下${IN}.org
并将更改应用到输入文件。
答案4
也许是一个更好的方法:
OUT=/dev/stdout
IN=my_in_file.txt
sed -s 's/in/out/' < $IN > $OUT
-or-
sed -s 's/in/out/' > $OUT < $IN
IN=my_in_text
sed -s 's/in/out/' <<< $IN > $OUT
-or-
sed -s 's/in/out/' > $OUT <<< $IN
:)