将 here-doc 用于 `sed` 和文件

Tri*_*ian 11 bash sed here-document

我想对 sed 命令使用 here-doc 并提供要读取的文件和输出文件。

我已经查看了Advanced Bash Scripting guide中的Here-Documents,但它没有提到使用 here-doc 时关于常规参数的任何内容。甚至有可能吗?

我想实现以下目标:

#!/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;
Run Code Online (Sandbox Code Playgroud)

任何帮助都非常感谢。

cam*_*amh 17

你可以告诉 GNU sed 从标准输入读取脚本-f --f意思是从文件读取脚本,-意思是标准输入,这在很多命令中都很常见。

sed -f - "$IN" > "$OUT" << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT
Run Code Online (Sandbox Code Playgroud)

POSIX sed 也支持-f,但-没有记录用于标准输入。在这种情况下,您可以/dev/stdin在 Linux 系统上使用(我似乎记得 Solaris 也有这个,但我现在无法确认)

使用<<-SED_SCRIPT(带有“-”前缀)将允许SED_SCRIPT缩进结束标记。


pab*_*ouk 5

如果sed不支持从stdin(使用-f -)读取脚本,您可以使用进程替换(在bashzsh、 中可用ksh93):

sed "$IN" > "$OUT" -f <( cat << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT)
Run Code Online (Sandbox Code Playgroud)

右括号)必须紧跟在结束分隔符 ( SEC_SCRIPT) 之后或在换行符之后。在流程替换的情况下,您还可以使用echo代替此处的文档:

sed "$IN" > "$OUT" -f <( echo \
"    s/a/1/g
    s/test/full/g" )
Run Code Online (Sandbox Code Playgroud)