Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Shell脚本:无法替换yml文件中的正则表达式匹配组_Linux_Shell_Unix_Sh - Fatal编程技术网

Linux Shell脚本:无法替换yml文件中的正则表达式匹配组

Linux Shell脚本:无法替换yml文件中的正则表达式匹配组,linux,shell,unix,sh,Linux,Shell,Unix,Sh,我引用了多个答案,但没有一个对我的问题有帮助,因此提出了一个新问题。 详情如下: echo $testPorts output: - "4441:4441" - "5905:5900" 现在我需要将test.yml文件中可用的端口替换为上述端口 以与test.yml相同的格式输出 Regex:(端口:)(\n.*\n.*) 需要在test.yml和my中用上述端口替换第二组 预计yml将为 我花了这么多时间在这个问题上,仍然无法找到解决办法 我尝试过的命令:(它们都不起作用) sed

我引用了多个答案,但没有一个对我的问题有帮助,因此提出了一个新问题。 详情如下:

echo $testPorts
output:    - "4441:4441" - "5905:5900"
  • 现在我需要将test.yml文件中可用的端口替换为上述端口
  • 以与test.yml相同的格式输出

    Regex:(端口:)(\n.*\n.*)

  • 需要在test.yml和my中用上述端口替换第二组

  • 预计yml将为
我花了这么多时间在这个问题上,仍然无法找到解决办法

我尝试过的命令:(它们都不起作用)

sed-r
也不工作

原始测试。yml:

version: '2'
services:
    ports:
      - "4444:4444"
      - "5901:5900"

下面的代码只是等待
端口:
行,然后忽略接下来的两行,并代替它们打印
testPorts
变量的内容。我假设,
testPorts
变量在每行内容前面包含适当数量的制表符或换行符

下面将
testPorts
变量的内容保存到某个文件中,而不带尾随换行符。然后
sed
等待包含
端口的行:
。如果该行包含端口,则打印该行,然后将下两行追加到图案空间并删除。然后将临时文件的内容附加到输出。因为
echo
输出了一个换行符,而我在输出中遇到了一些问题,所以在添加端口后,我还读取了下一行,并删除了额外的换行符

echo "$testPorts" > tempfile.txt
sed '/ports:/{ p;N;N;s/.*//; r tempfile.txt'$'\n'' N; s/\n//; }' input.txt
sed
中的
r
命令后需要换行符,因为
sed
中的命令由换行符分隔(将
“命令”作为文件名的一部分进行解析)。有关
sed
脚本的更多信息,请访问。
$'\n'
是一个新行-它使用


您可以按照自己的意愿进行操作-即在遇到
端口后匹配两个换行符:
。为此,您必须将
testport
变量中的换行符替换为两个字符-
\
n
。然后您可以在GNU中使用该变量,并使用
-z
选项来解析整个文件。因为正则表达式是贪婪的,所以必须显式定义要匹配的正则表达式,直到一个空格匹配一行。
可以显示
echo“$testport”
的输出吗。Sed一次解析一行,要读取Sed中的下一行,请在Sed中使用
n
n
命令。您是否希望
端口
之后只有两行需要更换,或者行数可能不同?@KamilCuk,输出为“4441:4441”-“5905:5900”行数将保持为2行,但不会不同。请编辑您的问题并在帖子中包含相关信息。换行符在注释中不可见。Sed具有以换行符结尾的命令。如果
testPorts
变量包含换行符,则需要使用另一种方法。可能是这样,但是您的
echo$testPorts
没有太多说明,因为它没有被引用。请在问题中包括相关信息。你的报价是错误的。您需要这样引用:
's/(ports:)(\n.*\n.*)/\2'${testPorts}'/g'
@ceving,它给出了sed:-e表达式#1,char 24:unterminated`s'命令我尝试了
{sed'/container\u name:/q'printf“$testPorts”>>docker-compose.yml}编辑了
test.yml,下面是输出,这给了我yml文件中的语法错误。我想要端口及其键作为容器名称的列表
version:'2'服务:容器名称:test11端口:-“4441:4441”-“5905:5900”
我的预期文件应采用以下格式:
版本:'2'服务:容器名称:test11端口:-“4441:4441”-“5905:5900”
此外,我无法找到sed'/container\u name:/q'中/q的用法,以及?有问题吗?我甚至在repl上贴了一个带有示例的链接——研究一下。
version: '2'
services:
    ports:
      - "4444:4444"
      - "5901:5900"
echo "$testPorts" > tempfile.txt
sed '/ports:/{ p;N;N;s/.*//; r tempfile.txt'$'\n'' N; s/\n//; }' input.txt
testports_escaped=$(sed -z 's/\n/\\n/g' <<<"$testPorts")
sed -z 's/\([[:space:]]*ports:[^\n]*\n\)[^\n]*\n[^\n]*\n/\1'"$testports_escaped"'/' input.txt
{
    sed '/ports:/q'
    read
    read
    printf "%s\n" "$testPorts"
    cat
} < input.txt
awk -v v="$testPorts" '/ports:/{ print; getline; getline; print v; getline; }1' input.txt
sed -n 'N;N;
  : a; {
    /ports:.*\n.*\n.*/{
            s/.*/ports:/
            r tempfile.txt'$'\n''
            b end
        }
        $ b end
        h
        s/\n.*//
        p
        g
        s/[^\n]*\n//
        N
    }; b a
    : end ; {
        : all
            p
            $ q
            n
        b all
    }
' input.txt