[英]Bash script search for file and replace if string found inside file using wildcards
[英]Replace text in a file in bash with / in the search string
如何用不同的行替換linux中的文件中的以下文本
目前:
0 22 * * * /scripts/application_folder_backup.sh >> /var/log/application_folder_backup.log
替換線:#line_removed
我嘗試使用sed但文件中的文本已經有/導致問題。 我也嘗試將字符串存儲在變量中。 但它不起作用
#!/bin/bash
var="0 22 * * * /scripts/application_folder_backup.sh >> /var/log/application_folder_backup.log"
sed -i -e 's/$var/#line_removed/g' /tmp/k1.txt
出口
這里只是/
不是問題,即使*
或者所有特殊的正則表達式元字符都是sed
的問題,因為它只使用正則表達式搜索模式。
最好使用這個基於non-regex
的awk
命令:
awk -v var="$var" 'index($0, var) { $0 = "#line_removed" } 1' file
#line_removed
awk
index
函數使用純文本搜索而不是基於正則表達式的搜索。
我建議先前將$var
的內容提供給sed腳本,以將所有/
chars轉義為\\/
,如下所示:
var_esc=$(echo "$var" | sed 's/\//\\\//g')
但是sed
表達式變得非常復雜(你必須使用單引號,如果你不想加倍\\
chars,因為雙引號也解釋反斜杠。
另一個可以簡化表達式的方法是使用更改regexp分隔符的可能性(使用不同的char來開始它),如下所示:
var_esc=$(echo "$var" | sed 's:/:\/:g')
在替換$var
變量之前,我們的想法是逃避所有可能存在的干擾字符(如果有的話,你不知道一個小修道院,因為你正在使用一個變量用於那個目的)然后替換他們在最后的命令中:
sed "s/$var_esc/#line_removed/g"
最后,如果您不想替換該行,只是為了刪除它,您可以執行以下操作:
sed "/$var_esc/d"
這將擦除與$var_esc
內容匹配的所有行。 (這次我相信你不能改變正則表達式分隔符,因為/
引入匹配行操作符--- d
是輸出中刪除行的命令)
刪除文件中行的另一種方法是直接調用ex
並將編輯器命令作為輸入傳遞:
ex file <<EOF <-- edit "file" with the commands that follow until EOF is found.
/$var_esc <-- search for first occurrence of $var_esc
d <-- delete line
w <-- write file
EOF <-- eof marker.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.