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