使用“sed”的此处文档和文件

使用“sed”的此处文档和文件

我想使用 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 -,您可以使用流程替代(可在bashzsh、中找到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

:)

相关内容