【问题标题】:Passing sed command line string to bash as variable将 sed 命令行字符串作为变量传递给 bash
【发布时间】:2026-01-03 08:35:02
【问题描述】:

我有一个 bash 脚本,它使用一个多行 sed 命令来更改文件。 从命令行,此行有效:

sed -e '1a\' -e '/DELIMITER="|" \' -e '/RESTRICT_ADD_CHANGE=1 \' -e '/FIELDS=UPDATE_MODE|PRIMARYKEYVALUE|PATRONFLAGS' -e '1 d' general_update_01 > general_update_01.mp

我对各种文件使用相同的 bash 脚本。所以我需要将发送应用程序中的所有 sed 命令作为单个参数传递给 bash 脚本。但是,当它从应用程序传入时,我只得到-e。

在 bash 脚本中,我尝试了多种方法来接收作为完整字符串的变量。这些都不存储变量。

sed_instructions=$(echo $6)
sed_instructions=$6
sed_instructions=$(eval "$6")

以及其他一些配置。

我的命令行会使用这样的变量:

sed $sed_instructions $filename > $filename.mp

【问题讨论】:

  • 你没有展示你如何调用你的 bash 脚本。
  • “我需要将所有的 sed 命令 [...] 作为单个参数传递”——你为什么这么认为?
  • BashFAQ #50 相关:我正在尝试将命令放入变量中,但复杂情况总是失败!

标签: bash variables sed


【解决方案1】:

我假设你像这样调用你的 shell 脚本

script.sh -e '1a' -e '/DELIMITER="|" ' -e '/RESTRICT_ADD_CHANGE=1 ' -e '/FIELDS=UPDATE_MODE|PRIMARYKEYVALUE|PATRONFLAGS' -e '1 d' general_update_01

您在这里要做的是将 nth 参数存储为文件名,并将前 n-1 个参数存储在数组中

#!/usr/bin/env

n=$#
filename=${!n}
sed_commands=("${@:1:n-1}")

# Now, call sed
sed "${sed_commands[@]}" "$filename" > "${filename}.mp"

演示代码的实际作用:

$ set -- one two three four
$ n=$#
$ filename=${!n}
$ args=("${@:1:n-1}")
$ declare -p filename args
declare -- filename="four"
declare -a args=([0]="one" [1]="two" [2]="three")

【讨论】: