簡體   English   中英

sed 或 awk 帶可變和特殊字符

[英]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 的一個參數,所以我無法更改它並在其中添加一些跳過字符。

如何在sedawk中使用帶有特殊字符的變量?

使用GNU sedc命令(用提供的字符串替換匹配的行)。 如果字符串的開頭有空格,則添加前綴\以保留它們

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.

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