在檔案中的符合行之後追加多行(指定為逐字 bash 變數)?

在檔案中的符合行之後追加多行(指定為逐字 bash 變數)?

我想在 bash 腳本的文字檔案中的匹配行之後附加多行。雖然我並不特別關心為這項工作選擇什麼工具,但對我來說重要的是我想指定腳本中“按原樣”附加的行(因此無需生成保存它們的附加文件),以便它們最終出現在Bash 變數中,並且無需引用/轉義其中的任何內容- 為此,使用「引用」heredoc 對我來說是可行的。這是一個例子appendtest.sh

cat > mytestfile.txt <<'EOF'
    "'iceberg'"
    "'ice cliff'"
    "'ice field'"
    "'inlet'"
    "'island'"
    "'islet'"
    "'isthmus'"
EOF

IFS='' read -r -d '' REPLACER <<'EOF'
      "'$oasis$'"
      "'$ocean$'"
      "'$oceanic trench$'"
EOF

echo "$REPLACER"

sed -i "/    \"'ice field'\"/a${REPLACER}" mytestfile.txt

不幸的是這不起作用:

$ bash appendtest.sh
      "'$oasis$'"
      "'$ocean$'"
      "'$oceanic trench$'"
sed: -e expression #1, char 39: unknown command: `"'

……因為sed使用未轉義的多行替換時失敗。所以我的問題是:

  • 我可以使用什麼來代替sed對一行文字執行匹配,並按照 Bash 變數($REPLACER在範例中)中指定的方式插入/附加行?

答案1

如果您使用 GNU sed,最好的選擇是使用以下r命令:

sed -i "/    \"'ice field'\"/ r /dev/stdin" mytestfile.txt <<'EOF'
      "'$oasis$'"
      "'$ocean$'"
      "'$oceanic trench$'"
EOF

答案2

好的,找到了使用方法perl

cat > mytestfile.txt <<'EOF'
    "'iceberg'"
    "'ice cliff'"
    "'ice field'"
    "'inlet'"
    "'island'"
    "'islet'"
    "'isthmus'"
EOF

IFS='' read -r -d '' REPLACER <<'EOF'
      "'$oasis$'"
      "'$ocean$'"
      "'$oceanic trench$'"
EOF

# echo "$REPLACER"

IFS='' read -r -d '' LOOKFOR <<'EOF'
    "'ice field'"
EOF
export REPLACER # so perl can access it via $ENV
# -pi will replace in-place but not print to stdout; -p will only print to stdout:
perl -pi -e "s/($LOOKFOR)/"'$1$ENV{"REPLACER"}'"/" mytestfile.txt
# also, with export LOOKFOR, this works:
# perl -pi -e 's/($ENV{"LOOKFOR"})/$1$ENV{"REPLACER"}/' mytestfile.txt
cat mytestfile.txt # see if the replacement is done

輸出如所期望的:

$ bash appendtest.sh
    "'iceberg'"
    "'ice cliff'"
    "'ice field'"
      "'$oasis$'"
      "'$ocean$'"
      "'$oceanic trench$'"
    "'inlet'"
    "'island'"
    "'islet'"
    "'isthmus'"

相關內容