如何基于带有换行符的变量删除带有sed的字符串?

时间:2018-08-02 05:36:39

标签: bash sed

我正在使用以下bash脚本,其目的是从Go文件中删除标头

#!/usr/bin/env bash

# Add header to files
HEADER=$(cat header.txt)

# loop over all go files
for i in $(find . -name \*.go); do
    # If present, remove it
    if fgrep -q "$HEADER" $i; then
        # remove the header
        sed -e "s/$HEADER/g" $i # <== THIS IS WHERE IT GOES WRONG        
    fi
done

但这会导致:

unescaped newline inside substitute pattern

我尝试过转义:

HEADER_ESCAPED="${HEADER@Q}"
echo $HEADER_ESCAPED

反过来会导致:

header.sh: line 10: ${HEADER@Q}: bad substitution

如何正确格式化/转义变量以替换标头(包括换行符)?

1 个答案:

答案 0 :(得分:1)

不幸的是,sed基本上是一种面向行的工具,不能替代行尾。

如果您真的想使用sed,并且标头具有唯一的第一行和最后一行,并且您不太在乎中间的内容,则可以使用类似的

sed '/first line/,/last line/d' $i

如果您真的想对整个标头进行替换,请尝试使用Perl,如果使用s修饰符,它可以应对替换行尾。

perl -e '$_ = join("", <>); s/'"$HEADER"'//s; print' $i

请注意,如果$HEADER包含bash或Perl元字符,则会出现问题。交给您整理报价!

相关问题