簡體   English   中英

嘗試使用bash中的Sed將heredoc寫入現有文件

[英]Trying to write a heredoc into an existing file using Sed in bash

我正在嘗試直接在[PHP]行下面的php.ini文件頂部寫一個heredoc。 假設滿足以下條件,我也會嘗試這樣做:

  1. [PHP]可能不是最頂層的(在其他用例中,知道如何將heredoc放在文件后面的任何地方會很好,所以指定'第2行'並不是很有用
  2. heredoc必須包含在文件中。 沒有使用sed打開另一個文件並將其讀入現有文件
  3. 假設[PHP]標識符只有一個實例。 在這個學習練習中,我不擔心迭代列表,或者Sed / Awk發現我的搜索字符串的多個實例
  4. 我真的希望每個項目都在自己的行上,就像在heredoc中一樣

腳本:

myvar=$(cat << END_HEREDOC
[xdebug]
zend_extension=/usr/lib/php/20151226/xdebug.so
xdebug.remote_host = localhost
xdebug.idekey = "PHPSTORM"
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.show_local_vars=0
xdebug.var_display_max_data=10000
xdebug.var_display_max_depth=20
xdebug.show_exception_trace=0
xdebug.remote_handler=dbgp
END_HEREDOC
)

echo ${myvar}

sed -i "/\[PHP\]'/${myvar}/'" php.ini

在我嘗試過的每一次迭代中,我最終得到的php.ini看起來像這樣:

[PHP]
$myvar

或者,我收到以下錯誤:

sed: -e expression #1, char 15: unknown command: `e'

我的目標是:

[PHP]

[xdebug]
zend_extension=/usr/lib/php/20151226/xdebug.so
xdebug.remote_host = localhost
xdebug.idekey = "PHPSTORM"
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.show_local_vars=0
xdebug.var_display_max_data=10000
xdebug.var_display_max_depth=20
xdebug.show_exception_trace=0
xdebug.remote_handler=dbgp

雖然可以使用sed完成此任務,但sed不是最佳的。 它不支持變量。 每當必須在sed命令中包含shell變量時,就會打開潛在的安全漏洞。 相比之下,Awk非常適合這項任務。 如果您有GNU awk(gawk),請嘗試:

$ cat script.sh
myvar='
[xdebug]
zend_extension=/usr/lib/php/20151226/xdebug.so
xdebug.remote_host = localhost
xdebug.idekey = "PHPSTORM"
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.show_local_vars=0
xdebug.var_display_max_data=10000
xdebug.var_display_max_depth=20
xdebug.show_exception_trace=0
xdebug.remote_handler=dbgp
'
awk -i inplace -v x="$myvar" '{print} /\[PHP\]/{print x}' php.ini

結果是:

$ cat php.ini
[PHP]

[xdebug]
zend_extension=/usr/lib/php/20151226/xdebug.so
xdebug.remote_host = localhost
xdebug.idekey = "PHPSTORM"
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.show_local_vars=0
xdebug.var_display_max_data=10000
xdebug.var_display_max_depth=20
xdebug.show_exception_trace=0
xdebug.remote_handler=dbgp

BSD / OSX或其他非GNU awk

如果你的awk不支持GNU的-i inplace選項,那么用以下代碼替換awk行:

awk -v x="$myvar" '{print} /\[PHP\]/{print x}' php.ini >tmp && mv tmp php.ini

筆記

myvar可以直接定義,如上所示,不使用cat或here-docs。

您可以使用sed r命令從文件中插入文本,但使用進程替換將文件名替換為heredoc:

#!/bin/bash

sed -i '' '/\[PHP]/r '<(cat << END_HEREDOC
[xdebug]
zend_extension=/usr/lib/php/20151226/xdebug.so
xdebug.remote_host = localhost
xdebug.idekey = "PHPSTORM"
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.show_local_vars=0
xdebug.var_display_max_data=10000
xdebug.var_display_max_depth=20
xdebug.show_exception_trace=0
xdebug.remote_handler=dbgp
END_HEREDOC
) php.ini

有時,好的舊ed也可能有所幫助。 喜歡:

(
printf '%s\n' '/^\[PHP\]/' i

cat <<'END_HEREDOC'
[xdebug]
zend_extension=/usr/lib/php/20151226/xdebug.so
...
END_HEREDOC

printf '%s\n' . w q
) | ed -s php.ini > /dev/null

編輯 - 更簡單(沒有“動態”):)

ed -s php.ini >/dev/null <<'END_HEREDOC'
/^\[PHP\]/
i
[xdebug]
zend_extension=/usr/lib/php/20151226/xdebug.so
.
w
q
END_HEREDOC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM