Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash多行herdoc(w/Sed)的正确语法是什么?_Bash_Sed_Multiline_Heredoc - Fatal编程技术网

bash多行herdoc(w/Sed)的正确语法是什么?

bash多行herdoc(w/Sed)的正确语法是什么?,bash,sed,multiline,heredoc,Bash,Sed,Multiline,Heredoc,在使用Sed搜索/插入配置文件时,我遇到了错误。是什么导致了它们,我如何修复它们 我希望插入的Heredoc可以定义如下: read -d '' APPLICATION_ENV_STATE <<'EOF' defined('APPLICATION_ENV') || define('APPLICATION_ENV',(getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production')); EOF 其结果

在使用Sed搜索/插入配置文件时,我遇到了错误。是什么导致了它们,我如何修复它们

我希望插入的Heredoc可以定义如下:

read -d '' APPLICATION_ENV_STATE <<'EOF'
defined('APPLICATION_ENV') || define('APPLICATION_ENV',(getenv('APPLICATION_ENV') 
    ? getenv('APPLICATION_ENV') : 'production'));
EOF
其结果是:

sed: -e expression #1, char 1: unknown command: `?'
除了命令错误后的额外字符

但是,以下herdoc可以工作,但会在我的文本文件中产生一些不太好的格式:

read -d '' APPLICATION_ENV_STATE <<'EOF'
defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
EOF  

read-d''应用程序的环境状态AIUI,问题不在于herdoc,而在于理解哪个进程在不同时间做什么

在运行
sed
命令的脚本中,Bash在
sed
看到变量之前替换该变量。作为一个多行字符串,它需要对
sed
)进行转义。从,在
i
命令下:

i \     Insert text, which has each embedded newline preceded by a back-slash.
就我个人而言,我建议尽可能使用
cat
或echo(或Python/Ruby/PHP等脚本语言),将模板分解为原子元素,这样就可以简单地将相关部分连接在一起

但是,如果确实要继续使用当前方法,则至少需要用反斜杠换行符替换换行符-请尝试以下操作:

echo $APPLICATION_ENV_STATE | sed 's/$/\\/'

你用错工具了。在sed中应该使用的唯一构造是s、g和p(带-n)。只需使用awk并避免所有引用/转义的废话:

$ cat file
foo
// ** MySQL settings ** //
bar

$ awk -v app="defined('APPLICATION_ENV') || define('APPLICATION_ENV',(getenv('APPLICATION_ENV')
    ? getenv('APPLICATION_ENV') : 'production'));" '
{print} index($0,"// ** MySQL settings ** //"){print app}' file
foo
// ** MySQL settings ** //
defined('APPLICATION_ENV') || define('APPLICATION_ENV',(getenv('APPLICATION_ENV')
    ? getenv('APPLICATION_ENV') : 'production'));
bar
请注意,您不需要转义要搜索的字符串中的RE元字符,因为awk可以将字符串视为字符串,您不需要转义要添加的字符串中的换行符,也不需要带有shell变量的here doc等


对于搜索和/或替换字符串中的各种字符组合,您编写的read/sed命令将失败-有关如何在sed中稳健地搜索/替换“字符串”,请参阅,然后只使用awk,这样您就不必担心任何问题。

尝试转义问号。(\?)看起来问题出在
$APPLICATION\u ENV\u STATE
中的换行符。这是一个非常好的答案,谢谢。由此,我通过将变量/herdoc修改为:
code
defined('APPLICATION_ENV')| | define('APPLICATION_ENV'),(getenv('APPLICATION_ENV')\\?getenv('APPLICATION_ENV'):'production');EOF
code
,它与我原来的Sed命令配合得非常好。在这个特定的示例中,我使用的是作为Wordpress安装的一部分生成的配置文件,将这些部分分离成单独的变量将需要更多的工作。再次感谢您的回答:)尝试更新投票,但无法更新,并尝试格式化我的代码示例,但在我尝试标记时,它拒绝了我的更改。再次感谢你,很高兴能帮上忙。如果它解决了您的问题,请将其标记为可接受的答案(没有真正的投票需要,作为一个新用户,您可能还不能这样做),这是一个强有力的声明,为什么这些应该是我使用的唯一Sed功能?awk看起来也不错。我已经使用sed 30多年了,awk已经使用了大约20年了,所有其他的sed结构都是为了实现功能,awk结构可以做得更简单、可靠、高效、可扩展、一致,sed是一个很好的工具,可以在单独的行上进行简单的替换,但是在20世纪70年代中期,当awk被发明时,所有其他需要以不太可能的配置进行排列以对文本产生一次性影响的神秘的单字符sed语言结构都已过时。看一些例子,我来看看。我一直试图做的一件事是尽可能地保持脚本整洁,对我来说,这意味着存储这些字符串以插入文件顶部的配置文件,远离脚本的逻辑。您提到我的read命令也可能因某些字符串模式而失败?您将如何获得这样存储的多行变量?(在看到另一个堆栈溢出的答案后,我最初选择了
read-d'
)。任何时候在shell中编写read命令时,都应该使用
IFS=read-r var
,除非您有特定的理由排除
IFS=
-r
,并完全理解其效果。如果要读取的字符串以空格开头或包含反斜杠,请尝试当前的方法,您会发现它会删除前导空格和反斜杠。Shell不用于处理文本,因此很难稳健地执行。编写shell的人也编写awk,其目的正是为了操纵文本。如果没有一个新的问题,我不确定该给出什么样的建议?这个例子已经出现在我的问题中了;我将一个heredoc读入一个变量。不过,您提到read/sed命令在某些情况下可能会失败。我必须查找read命令和IFS变量(我以前使用过它,但它的用途目前还没有实现)。
$ cat file
foo
// ** MySQL settings ** //
bar

$ awk -v app="defined('APPLICATION_ENV') || define('APPLICATION_ENV',(getenv('APPLICATION_ENV')
    ? getenv('APPLICATION_ENV') : 'production'));" '
{print} index($0,"// ** MySQL settings ** //"){print app}' file
foo
// ** MySQL settings ** //
defined('APPLICATION_ENV') || define('APPLICATION_ENV',(getenv('APPLICATION_ENV')
    ? getenv('APPLICATION_ENV') : 'production'));
bar