使用here-doc处理sed和文件


10

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

我看过Advanced Bash Scripting指南中的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;

任何帮助都非常感谢。

Answers:


14

您可以使用来告诉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标记缩进。


谢谢,您所说的有效,我想指出结束符不能缩进,否则会导致bash错误,我认为这是因为在结束符中还包含空格。
Tristian 2012年

请注意,Apple OS X sed不支持从标准输入读取脚本。(至少不是以这种方式或任何其他有据可查的方式。)
丹诺顿

@danorton:我添加了一个不需要in 支持但需要流程替换的解决方案:。-f -sed<( command )
pabouk

5

如果sed不支持从读剧本的stdin(使用-f -),您可以使用进程替换(提供bashzshksh93):

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" )

1
在Mac OS X上,它不喜欢紧接sed命令本身的输入文件("$IN"甚至是testfile.txt)-它需要a -e script-f file。重新安排@pabouk的答案对我有用:sed -f <( cat << ETC ... ETC) "$IN" > "$OUT"
Stephen P

在使用bash 4.2.45和标准BSD sed的Max OSX上,右括号必须位于close 下方的新行上SED_SCRIPT
Alexander Klimetschek

-1

也许是更好的方法:

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

:)


1
有趣,但要点。OP希望通过stdin传递sed命令。
muru

这种方法允许两种方法,为什么要投票?
Magnus

重复:“通过stdin传递sed命令”。您的回答绝不是任何方法。
muru
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.