读取文件时 sed 替换发生在意想不到的行中
sed substitution while reading a file happens in unexpected lines
我使用的是 macOS 11.0.1。我正在编写一个 bash 脚本来处理降价文件。它必须逐行读取文件(开头的 $HEADER 变量除外)和:
- 不要编辑以#
开头的行
- 为所有其他行添加前缀 (
{{< p "
) 和后缀 (" >}}
)
这是我目前得到的:
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
插入整个匹配项(原始行),然后是“ >} }".
我使用的是 macOS 11.0.1。我正在编写一个 bash 脚本来处理降价文件。它必须逐行读取文件(开头的 $HEADER 变量除外)和:
- 不要编辑以# 开头的行
- 为所有其他行添加前缀 (
{{< p "
) 和后缀 (" >}}
)
这是我目前得到的:
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
插入整个匹配项(原始行),然后是“ >} }".