[英]sed or awk with variable and special charachters
我想使用 awk 或 sed 替換我文件中的 1 行:
我的文件內容是:
server.modules += ( "mod_redirect" )
$SERVER["socket"] == ":8080" {
$HTTP["host"] =~ "(.*)" {
url.redirect = ( "^/(.*)" => "https://someurl.com/unauthorised" )
}
}
我想更改包含url.redirect
的行 新行在變量中並且包含一些特殊字符將類似於url.redirect = ( "^/(.*)" => "http://newurl.com/newpath" )
所以我使用了以下 sed 命令:
sed "/url\.redirect =/s/.*/$newline/" 10-redirect.conf
但是我得到了與newline
變量中的特殊字符相關的錯誤。
換行符是我的 shell function 的一個參數,所以我無法更改它並在其中添加一些跳過字符。
如何在sed
或awk
中使用帶有特殊字符的變量?
使用GNU sed
和c
命令(用提供的字符串替換匹配的行)。 如果字符串的開頭有空格,則添加前綴\
以保留它們
sed '/url\.redirect =/c\'"$newline"
但是, c
命令仍將允許轉義序列,例如:
$ s=' rat\tdog\nwolf'
$ seq 3 | sed '2c\'"$s"
1
rat dog
wolf
3
要從字面上和健壯地添加內容,請使用r
命令
echo "$newline" | sed -e '/url\.redirect =/ {r /dev/stdin' -e 'd}'
這是r
命令在運行
$ s=' rat\tdog\nwolf'
$ echo "$s" | sed -e '2 {r /dev/stdin' -e 'd}' <(seq 3)
1
rat\tdog\nwolf
3
請您嘗試以下操作。 這應該在之前存在的新值前面放置相同的空格。
newline='url.redirect = ( "^/(.*)" => "https://example.com/authorised" )'
awk -v line="$newline" '
/url.redirect =/{
match($0,/^ +/)
print substr($0,RSTART,RLENGTH) line
next
}
1
' Input_file
您在sed
中遇到錯誤,因為它使用的是正則表達式,並且您的替換字符串可能包含元字符,例如&
或/
(分隔符)等。
由於非正則表達式方法,此awk
使用起來會更安全:
newline='url.redirect = ( "^/(.*)" => "https://example.com/authorised" )'
awk -i inplace -v line="$newline" 'index($0, "url.redirect =") {
sub(/[^[:blank:]].*/, "")
$0 = $0 line
} 1' file
server.modules += ( "mod_redirect" )
$SERVER["socket"] == ":8080" {
$HTTP["host"] =~ "(.*)" {
url.redirect = ( "^/(.*)" => "https://example.com/authorised" )
}
}
請注意,使用ENVIRON
將允許所有 shell 特殊字符到 awk:
export newline
awk -i inplace 'index($0, "url.redirect =") {
sub(/[^[:blank:]].*/, "")
$0 = $0 ENVIRON["newline"]
} 1' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.