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}"

这是怎么做到的?

首先,我将替换行存储在脚本中的here文档中:

IFS= read -d '' text << "EOF"
directory_bin="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
directory_env="$(dirname "${directory_bin}")"
VIRTUAL_ENV="${directory_env}"
EOF

接下来,我可以使用sed:将文件中的行替换为其他行(此处为xxx

sed -i "s/^VIRTUAL_ENV.*/xxx/g" test.txt

现在,我如何使用此处定义的文档变量${text}及其所有换行符等,而不是sed命令中的xxx


编辑:根据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}"

我仍然想知道如何直接使用这里的文档,这样我就不会不必要地使用硬盘了。

我会单独使用sed

/^VIRTUAL_ENV/{
r source.txt
d
}

其中source.txt是放置新行以替换以"VIRTUAL_ENV"开头的行的文件。

如果您真的需要新行(source.txt)作为here文档,/dev/fd/0技巧将起作用(至少在Linux中)。但你也可以把mktempmkfifo结合起来。

编辑

为了解决"我仍然想知道如何直接使用此处文档":

!/bin/bash
sed -e '/^VIRTUAL_ENV/{' -e 'r /dev/fd/0' -ed -e'}' test.txt << "EOF"
directory_bin="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
directory_env="$(dirname "${directory_bin}")"
VIRTUAL_ENV="${directory_env}"
EOF

由于/dev/fd/0部分的缘故,不太便于移植(不过可以在Linux中使用)。

这可能对你有用(GNU sed&bash):

cat <<! | sed $'/PATTERN/{r /dev/stdinn;d}' file
HERE DOCUMENT
STUFF
HERE
!

使用catstdin管道传输到sed命令中,并使用r命令将其作为文件读取。

注意:!引用此处文档中的所有文本,使用!插入变量。$'...'允许需要换行的命令(即sed命令,例如raicRwW)被写为一行。

sed的许多方言允许您在替换中转义换行符:

sed -i 's/^VIRTUAL_ENV.*/directory_bin="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
directory_env="$(dirname "${directory_bin}")"
VIRTUAL_ENV="${directory_env}"/' test.txt

这是一个跨越三行的单引号字符串,在每个内部行边界添加了一个反斜杠作为延续。

这并不是所有sed变体都可以移植的,但至少在*BSD(包括OSX)和Linux上运行良好。

顺便说一句,您也可以简单地将所有这些命令放在一行中,它们之间用分号分隔。

相关内容

  • 没有找到相关文章

最新更新