簡體   English   中英

用搜索字符串中的/替換bash文件中的文本

[英]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-regexawk命令:

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.

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