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

Replace 使用find和sed将多行中的段替换为同一文件中的另一段,该文件位于多个文件夹中,replace,sed,find,segment,Replace,Sed,Find,Segment,我有一个包含多个文件夹的目录结构: Applications | |____Salford_123 | |_________SomeFile.png | |_________AnotherFile.nui | |_________MenuSettings.txt | |_________Data | |_____Settings.txt | |____Salford_546 | |_________SomeFile.png | |_________

我有一个包含多个文件夹的目录结构:

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:和AppName_yy_yy:中的值,使其看起来像这样

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//\1/;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命令。我正在使用hold缓冲区来保留URL,并且对于从hold缓冲区附加的xx/yy行,在去掉原始值之后

第一个括号内的表达式使用hold在hold缓冲区中复制该行。
s//
重用最后一个模式,不使用任何内容替换它,只保留引用的URL。
x
将编辑的行与副本交换,因此它输出原始行,同时将URL保留在保留缓冲区中


下一个括号内的表达式使用
s//\1/
重用上一个模式,并用捕获的字符替换匹配项
G
将保留缓冲区内容追加到换行符之后的模式空间末尾。
s/\n/
将换行符替换为空格。

感谢@dancancode,在sed中使用hold是我直到现在才意识到的。是否可以在文件之间保存段?sed将多个文件参数视为一个输入流。保持缓冲区在内存中,因此当sed退出时,保持缓冲区将消失(除非使用
w
命令将其写入文件)。如果将多个文件赋给一个sed命令(并且未使用
-i
就地开关),则可以将保持缓冲区中的值用于后续文件的输入。