Regex 在linux中,在正则表达式之后向文件追加文本

Regex 在linux中,在正则表达式之后向文件追加文本,regex,linux,nginx,awk,sed,Regex,Linux,Nginx,Awk,Sed,我想在nginx文件的配置中添加额外的文本行。我编写了一个正则表达式,尽管它不适用于sed。在找到的文本之后添加文本的脚本应该是什么样子 我正在尝试使用此命令,但未成功: sed '/location \/ {(\n|.)*?[a-zA-Z0-9 \n;#._\/=$,]*}/r nginxphp.txt' /etc/nginx/sites-available/default 这个问题中最重要的是在sed语法中regex应该是什么样子? 或者只是另一种在debian中向文件中注入一些行的方法(

我想在nginx文件的配置中添加额外的文本行。我编写了一个正则表达式,尽管它不适用于sed。在找到的文本之后添加文本的脚本应该是什么样子

我正在尝试使用此命令,但未成功:

sed '/location \/ {(\n|.)*?[a-zA-Z0-9 \n;#._\/=$,]*}/r nginxphp.txt' /etc/nginx/sites-available/default
这个问题中最重要的是在sed语法中regex应该是什么样子?

或者只是另一种在debian中向文件中注入一些行的方法(在我的示例中) 我想在/etc/nginx/sites available/default中进行更改:

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;
            # Uncomment to enable naxsi on this location
            # include /etc/nginx/naxsi.rules;
    }
HERE SOME TEXT

我建议使用这个
gnu awk

awk -i inplace -v RS='\n[[:blank:]]*location / {[^}]*}' '1
RT {
   print RT 
   if ((getline < "nginxphp.txt") > 0)
      print
}' /etc/nginx/sites-available/default
awk-i inplace-v RS='\n[:blank:]*位置/{[^}]*}'1
RT{
打印RT
如果((getline<“nginxphp.txt”)>0)
打印
}'/etc/nginx/sites available/default
  • RS='\n[:blank:]*location/{[^}]*}
    匹配完整的
    location
    块,并将其作为记录分隔符
  • print RT
    打印此匹配文本
  • getline
    函数读取内存中的
    nginxphp.txt
    ,然后使用
    print
    语句打印

我建议使用gnu awk:

awk -i inplace -v RS='\n[[:blank:]]*location / {[^}]*}' '1
RT {
   print RT 
   if ((getline < "nginxphp.txt") > 0)
      print
}' /etc/nginx/sites-available/default
awk-i inplace-v RS='\n[:blank:]*位置/{[^}]*}'1
RT{
打印RT
如果((getline<“nginxphp.txt”)>0)
打印
}'/etc/nginx/sites available/default
  • RS='\n[:blank:]*location/{[^}]*}
    匹配完整的
    location
    块,并将其作为记录分隔符
  • print RT
    打印此匹配文本
  • getline
    函数读取内存中的
    nginxphp.txt
    ,然后使用
    print
    语句打印
使用sed:

sed '/location \/ {/!b;:A;N;/}/!bA;r nginxphp.txt' /etc/nginx/sites-available/default
对于sed:

sed '/location \/ {/!b;:A;N;/}/!bA;r nginxphp.txt' /etc/nginx/sites-available/default

这可能是您想要的,将GNU awk用于多字符RS和RT:

awk '
NR==FNR { new=$0; next }
{ print $0 (RT ? RT new : "") }
' \
ORS="" \
RS='^$' nginxphp.txt \
RS='(^|\n)[[:blank:]]*location */ *{[^}]*} *\n' /etc/nginx/sites-available/default

这可能是您想要的,将GNU awk用于多字符RS和RT:

awk '
NR==FNR { new=$0; next }
{ print $0 (RT ? RT new : "") }
' \
ORS="" \
RS='^$' nginxphp.txt \
RS='(^|\n)[[:blank:]]*location */ *{[^}]*} *\n' /etc/nginx/sites-available/default

它起作用了!非常感谢你!值得一提的是,要保存执行的操作,请添加
-i inplace
参数。如果getline失败,则脚本将悄悄地、秘密地重新打印“位置”行之前的整个“默认”文件。它还将在“location”行之后、输出的末尾以及“nginxphp.txt”的内容之后添加一个额外的空行,如果该文件包含一行与“location”regexp匹配的内容,那么您只需获得前面的部分。有关使用getline的时间和方法,请参阅。感谢
getline
上的有用链接。我现在已经编辑好了,很有效!非常感谢你!值得一提的是,要保存执行的操作,请添加
-i inplace
参数。如果getline失败,则脚本将悄悄地、秘密地重新打印“位置”行之前的整个“默认”文件。它还将在“location”行之后、输出的末尾以及“nginxphp.txt”的内容之后添加一个额外的空行,如果该文件包含一行与“location”regexp匹配的内容,那么您只需获得前面的部分。有关使用getline的时间和方法,请参阅。感谢
getline
上的有用链接。我现在已经编辑过了。
nginxphp.txt
的内容是单行还是多行?如果是多行,则在您的问题中显示其内容的示例,以便我们查看它是否也包含与您的regexp匹配的行。
nginxphp.txt
的内容是单行还是多行?如果multi line,则在您的问题中显示其内容的示例,以便我们可以查看它是否也包含与您的regexp匹配的行。这看起来也不错,但在默认配置文件中,我有多个位置键(第二个是注释的),因此我认为此脚本应该添加此文件。这看起来也不错,但在默认配置文件中,我有多个位置键(第二个是注释的),所以我认为这个脚本应该添加这个文件一次