使用 sed 替换文本时是否可以保留原始文件选项卡

使用 sed 替换文本时是否可以保留原始文件选项卡

我正在使用 sed 替换 shell 脚本中的一些文本,这是原始文件,如下所示:

server {
    listen       80;
    server_name  localhost;

    location /api/test {
        proxy_connect_timeout 3000;
        proxy_send_timeout 3000;
        proxy_read_timeout 3000;
        send_timeout 3000;
        client_max_body_size 10M;
        client_body_buffer_size 100M;
        proxy_pass http://www.1.com;
    }

    location /api/demo {
        proxy_connect_timeout 3000;
        proxy_send_timeout 3000;
        proxy_read_timeout 3000;
        send_timeout 3000;
        client_max_body_size 10M;
        client_body_buffer_size 100M;
        proxy_pass http://www.2.com;
    }
}

这是我的 shell 脚本:

#!/usr/bin/env bash

set -u

set -e

# set -x

echo "please input url1:"

read URL1

echo "plase input url2:"

read URL2

URL1_ESCAPED_REPLACE=$(printf '%s\n' "$URL1" | sed -e 's/[\/&]/\\&/g')

URL2_ESCAPED_REPLACE=$(printf '%s\n' "$URL2" | sed -e 's/[\/&]/\\&/g')

timestamp=$(date +%s)

sed -Ei."$timestamp".bak -e "/\/api\/test/,/proxy\_pass/ s/.*proxy\_pass.*/proxy\_pass $URL1_ESCAPED_REPLACE;/" \
-e "/\/api\/demo/,/proxy\_pass/ s/.*proxy\_pass.*/proxy\_pass $URL2_ESCAPED_REPLACE;/" nginx.conf

这个脚本工作正常,但我面临一个问题,替换操作使空格缩进消失。是否可以只替换文本而不删除空白?我想保留原始文本格式。

答案1

如果删除没有问题.*s/.*proxy\_pass那么它应该可以解决您的问题。问题是您指定sed命令来替换与.*proxy_pass.*和匹配.*的所有字符串任何字符零次或多次。因此在这种情况下,之前和之后的所有内容都proxy_pass将被删除,因此缩进也将被删除。

为了解决这个问题,你的sed命令应该是这样的:

sed -Ei."$timestamp".bak -e "/\/api\/test/,/proxy\_pass/ s/proxy\_pass.*/proxy\_pass $URL1_ESCAPED_REPLACE;/" \
-e "/\/api\/demo/,/proxy\_pass/ s/proxy\_pass.*/proxy\_pass $URL2_ESCAPED_REPLACE;/" nginx.conf

答案2

使用开头.*将选择匹配文本之前的所有内容,包括空格。如果将其替换为固定文本proxy_pass,则所有前导空格都将被删除。您只需更改替换命令即可保留空格(使用\1)。

所以你的代码将变成:

timestamp=$EPOCHSECONDS

sed -Ei."$timestamp".bak -e "/\/api\/test/,/proxy_pass/ s/(.*proxy_pass).*/\1 $URL1_ESCAPED_REPLACE;/" \
-e   "/\/api\/demo/,/proxy_pass/ s/(.*proxy_pass).*/\1 $URL2_ESCAPED_REPLACE;/" infile

相关内容