读取文件时 sed 替换发生在意想不到的行中

sed substitution while reading a file happens in unexpected lines

我使用的是 macOS 11.0.1。我正在编写一个 bash 脚本来处理降价文件。它必须逐行读取文件(开头的 $HEADER 变量除外)和:

这是我目前得到的:

while read -r line; do
    if [[ "$line" == \#* ]]; then
        echo $line >> $OUTPUT
        continue
    else
        sed -E 's/^/{{< p "/; s/$/" >}}/' >> $OUTPUT
    fi
done < <(tail -n "+$HEADER" $INPUT)

这是我的输入(没有 header):

## I

Lorem Ipsum is simply dummy text 

我希望第一行被忽略,但这是输出:

{{< p "## I" >}}

{{< p "Lorem Ipsum is simply dummy text" >}}

奇怪的是“if”在没有 sed 的情况下也能工作,因为我可以将匹配的行转发到另一个文件...如果 sed 行被注释掉。 哪里做错了?

您没有向 sed 提供任何输入,因此它将忽略 $line 而是从标准输入读取文件的其余部分(即从 tail 命令) .此外,您应该在使用 $line 等变量时使用双引号(即 echo "$line" 而不是 echo $line)。

但在我看来,您可以用一个 sed 命令替换整个循环:

tail -n "+$HEADER" "$INPUT" | sed '/^#/ ! s/^.*$/{{< p & >}}/' >"$$OUTPUT"

说明:/^#/ ! 前缀告诉 sed 仅将此应用于 以“#”开头的行。然后 s/^.*$/{{< p & >}}/ 命令将整行替换为“{{< p”,然后是 &,告诉 sed 插入整个匹配项(原始行),然后是“ >} }".