我有,在某些時候包含諸如以下行文件:Bash - 如何用變量中定義的多行代替以模式開頭的單行?
VIRTUAL_ENV="/afs/sern.ch/user/l/lronhubbard/virtual_environment"
它是與VIRTUAL_ENV
開頭的文件中唯一的行。使用腳本,我想用下面幾行代替這一行:
directory_bin="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
directory_env="$(dirname "${directory_bin}")"
VIRTUAL_ENV="${directory_env}"
這怎麼可以做到?
首先,我得保存在一個腳本文件在這裏更換線路:
IFS= read -d '' text << "EOF"
directory_bin="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
directory_env="$(dirname "${directory_bin}")"
VIRTUAL_ENV="${directory_env}"
EOF
接下來,我可以替換別的文件中的線(在這裏,xxx
)使用sed
:
sed -i "s/^VIRTUAL_ENV.*/xxx/g" test.txt
現在,我怎麼可以使用這裏定義文檔變量${text}
,其所有新行和諸如此類的東西,而不是xxx
在sed
命令?
編輯:繼rslemos的建議,我已經實現了使用,而不是在這裏文檔的臨時文件如下:
#!/bin/bash
temporary_filename="$(tempfile)"
cat > "${temporary_filename}" << "EOF"
directory_bin="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
directory_env="$(dirname "${directory_bin}")"
VIRTUAL_ENV="${directory_env}"
EOF
sed -i "/^VIRTUAL_ENV.*/ {
r ${temporary_filename}
d
}" test.txt
rm "${temporary_filename}"
我還是想知道如何使用此文檔直接讓我不會不必要地使用硬盤。
請不要發佈答案作爲問題的一部分。如果您想添加自己的答案,請將其作爲答案進行發佈。 – tripleee