使用 find 和 sed 将多行中的段替换为同一文件中的另一个段,该文件位于多个文件夹中

Replacing segments in multiple lines with another segment in the same file, which is in multiple folders, using find and sed

我有多个文件夹的以下目录结构:

Applications
|
|____Salford_123
|   |_________SomeFile.png
|   |_________AnotherFile.nui
|   |_________MenuSettings.txt
|   |_________Data
|             |_____Settings.txt
|
|____Salford_546
|   |_________SomeFile.png
|   |_________AnotherFile.nui
|   |_________MenuSettings.txt
|   |_________Data
|             |_____Settings.txt
|
|____Salford_789
|   |_________SomeFile.png
|   |_________AnotherFile.nui
|   |_________MenuSettings.txt
|   |_________Data
|             |_____Settings.txt

每个文件夹中的文本文件MenuSettings.txt,内容如下:

AppName: "http://www.bbc.co.uk”
DoubleWidthTile: "False"
TileColor: "0.76 0 0.24 1"
AnimationSize: "10 10"
AppName_xx_XX: “Venice Quays”
AppName_yy_YY: “Venice Quays”

此文件及其父文件夹自动生成多次。文件的第一行每次都有不同的 URL ,可以是任意长度。我正在尝试复制带有 URL 的段以替换 AppName_xx_XX:and AppName_yy_YY:so 中的值,它看起来像这样

AppName: "http://www.bbc.co.uk”
DoubleWidthTile: "False"
TileColor: "0.76 0 0.24 1"
AnimationSize: "10 10"
AppName_xx_XX: “http://www.bbc.co.uk”
AppName_yy_YY: “http://www.bbc.co.uk”

AppName_xx_XX: 和 AppName_yy_YY: 的条目将在其中生成任意长度的任何单词,并带有空格和标点符号。字符串的 xx 和 yy 部分可以是任意 2 个字符。所以我使用 "find" 在文件夹中递归搜索,并使用 "sed" 命令复制和替换段,输出到另一个文件,然后我将 mv -v 返回到原始文件。

find salford* -maxdepth 1 -type d \( ! -name . \) -exec sh -c '(cd {} && 

cat MenuSettings.txt | sed -e 's/AppName\_en\_[[A-Z]]\:[[:blank:]]\"[[:alpha:]]*.\"/AppName\:[[:space:]]\"[[:alpha:]]*.[[:alpha:]]*.[[:alpha:]]*.\"/g' > MenuSettings3.txt

)' ';'

bash 文件运行时没有错误,但无法运行,因为它生成的文件没有显示任何更改。我哪里错了?

$ sed '/^AppName: */{h;s///;x;}; /^\(AppName_.._..:\).*/{s///;G;s/\n/ /;}' MenuSettings.txt
AppName: "http://www.bbc.co.uk”
DoubleWidthTile: "False"
TileColor: "0.76 0 0.24 1"
AnimationSize: "10 10"
AppName_xx_XX: "http://www.bbc.co.uk”
AppName_yy_YY: "http://www.bbc.co.uk”

我根据您的描述制作了上述 sed 命令。我正在使用保留缓冲区来保留 URL,并在删除原始值后从保留缓冲区追加 xx/yy 行。

第一个括号中的表达式使用 hold 在保持缓冲区中复制该行。 s/// 重用了最后一个模式并将其替换为空,只留下引用的 URL。 x 将编辑后的行替换为副本,因此它输出原始行,同时将 URL 保留在保持缓冲区中。

下一个括号表达式使用 s/// 重复使用最后一个模式并用捕获的字符替换匹配项。 G 将保持缓冲区内容附加到模式 space 的末尾,在换行符之后。 s/\n/ / 用 space.

替换换行符