如何使用 删除指定单词第一次出现之前的所有内容sed
?
到目前为止我已经尝试过:
echo $(cat /etc/nginx/sites-enabled/default | sed 's/^*.server/server/') > /etc/nginx/sites-enabled/default
我需要清理所有垃圾,然后才能找到第一个“服务器”单词。
我主要需要一个sed
正则表达式......
我有一个包含代理信息的 Nginx 默认文件,当脚本将其复制到 Docker 容器时,该文件的前导空格会增多,因此无法启动。我需要使用一些命令将其删除。
文件:
server
{
listen 80 default_server;
location /
{
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:5000;
}
}
我不确定那里有什么样的字符,所以我想删除“服务器”之前的所有内容。
答案1
您只需使用以下简单命令删除行首和单词“server”之间的每个空格字符(制表符、空格等)(仅当除了空格之外没有其他内容时):
sed -i 's/^\s*server/server/' FILENAME
该-i
选项会就地修改文件,这意味着所有更改都会立即应用并保存,并且您不会获得任何输出。如果您不想重写文件并查看修改后的新版本,请省略该-i
选项,命令会将其打印到 STDOUT(标准输出流)。
我使用正则表达式^\s*server
来匹配行首和单词“server”之间(包括)的任意数量的任何类型的空格,并让它用单词“server”本身替换这些匹配项。
答案2
GNU sed 具有一种特殊形式的范围地址0,/pattern/
,可让您仅匹配pattern
文件中第一次出现的地址,例如
sed '0,/server/ s/^.*server/server/' /etc/nginx/sites-enabled/default
或者(也许更好,因为它将匹配也锚定到行首)
sed '0,/^.*server/ s//server/' /etc/nginx/sites-enabled/default
在添加-i
(就地)标志和/或使用备份之前,请先尝试一下-i.bak