我正在使用以下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
如何正确格式化/转义变量以替换标头(包括换行符)?
答案 0 :(得分:1)
不幸的是,sed
基本上是一种面向行的工具,不能替代行尾。
如果您真的想使用sed
,并且标头具有唯一的第一行和最后一行,并且您不太在乎中间的内容,则可以使用类似的
sed '/first line/,/last line/d' $i
如果您真的想对整个标头进行替换,请尝试使用Perl,如果使用s
修饰符,它可以应对替换行尾。
perl -e '$_ = join("", <>); s/'"$HEADER"'//s; print' $i
请注意,如果$HEADER
包含bash
或Perl元字符,则会出现问题。交给您整理报价!