Regex 在另一行中查找并替换

Regex 在另一行中查找并替换,regex,perl,sed,Regex,Perl,Sed,假设我有几行,我必须在大括号内选择一个字符串,然后在几行之后用它替换其他地方 Here is the word that I need to select in braces (WORD) Second line Third line Forth line Path where I want it to replace /root/usr/destination/ few more lines 我想选择WORD并用WORD 所以看起来像这样 Here is the word that I n

假设我有几行,我必须在大括号内选择一个字符串,然后在几行之后用它替换其他地方

Here is the word that I need to select in braces (WORD)
Second line
Third line
Forth line 
Path where I want it to replace /root/usr/destination/
few more lines
我想选择
WORD
并用
WORD
所以看起来像这样

Here is the word that I need to select in braces (WORD1)
Second line
Third line
Forth line 
Path where I want it to replace /root/usr/WORD1/
few more lines

Also how can I do this for tis to be recurring in a same file
Here is the word that I need to select in braces (WORD2)
Second line
Third line
Forth line
Path where I want it to replace /root/usr/WORD2/
few more lines

Here is another  word that I need to select in braces (WORD3)
Second set of lines
Third line
Forth line
Path where I want it to replace /root/usr/WORD3/
few more lines and pattern repeats like this so on

默认情况下,sed逐行工作。因此,为了使用这种模式,您应该使用多行

一个更简单的替代方法是使用perl。Perl几乎与任何(如果不是全部的话)linux发行版和一些UNIX系统一起提供

所以你可以用这个:

perl-0777-pe的/([\s\s]*?\()([^)]+(\)[\s\s]*?\/root\/usr\/)目的地([\s\s]*?)/$1$2$3$2$4/g’file.txt

正则表达式是这样的:

([\s\s]*?\()([^)]+(\)[\s\s]*?\/root\/usr\/)目的地([\s\s]*?)

替换为:
$1$2$3$2$4


默认情况下,sed逐行工作。因此,为了使用这种模式,您应该使用多行

一个更简单的替代方法是使用perl。Perl几乎与任何(如果不是全部的话)linux发行版和一些UNIX系统一起提供

所以你可以用这个:

perl-0777-pe的/([\s\s]*?\()([^)]+(\)[\s\s]*?\/root\/usr\/)目的地([\s\s]*?)/$1$2$3$2$4/g’file.txt

正则表达式是这样的:

([\s\s]*?\()([^)]+(\)[\s\s]*?\/root\/usr\/)目的地([\s\s]*?)

替换为:
$1$2$3$2$4


我担心你发明的输入数据,因为它似乎与你评论中的“答案”无法正确处理的任何东西都不接近。但是,这里有一个解决方案,可以读取积分
数据
文件句柄。我一次读一行文件,而不是整个文件都在咕噜咕噜地读,因为这样更容易找到新的替换字符串

唯一的其他但书是

  • destination
    关键字永远不会出现在同一行的替换词之前

  • 无需区分路径字符串中出现的
    目标

  • 除了替换词周围的括号外,输入文本中没有括号

使用严格;
使用“全部”警告;
我的$rep;
而(){
$rep=$1如果/\([^()]+)\)/;
s/destination/$rep/g(如果定义为$rep);
印刷品;
}
__资料__
下面是我需要在大括号中选择的单词(WORD1)
第二线
第三行
第四行
我希望它替换的路径/root/usr/destination/
再多几行
下面是我需要在大括号中选择的单词(WORD2)
第二线
第三行
第四行
我希望它替换的路径/root/usr/destination/
再多几行
下面是我需要在大括号中选择的单词(WORD3)
第二线
第三行
第四行
我希望它替换的路径/root/usr/destination/
再多几行
输出
这里是我需要在大括号中选择的单词(WORD1)
第二线
第三行
第四行
我希望它替换的路径/root/usr/WORD1/
再多几行
下面是我需要在大括号中选择的单词(WORD2)
第二线
第三行
第四行
我希望它替换的路径/root/usr/WORD2/
再多几行
下面是我需要在大括号中选择的单词(WORD3)
第二线
第三行
第四行
我希望它替换的路径/root/usr/WORD3/
再多几行
虽然我建议不要使用它们,但这种单行程序版本是

perl-pe'$rep=$1if/\([^()]+)\)/;s/destination/$rep/g如果定义为$rep;'我的文件

我担心你发明的输入数据,因为它似乎与你评论中的“答案”所能正确处理的任何东西都不接近。但是,这里有一个解决方案,可以读取积分
数据
文件句柄。我一次读一行文件,而不是整个文件都在咕噜咕噜地读,因为这样更容易找到新的替换字符串

唯一的其他但书是

  • destination
    关键字永远不会出现在同一行的替换词之前

  • 无需区分路径字符串中出现的
    目标

  • 除了替换词周围的括号外,输入文本中没有括号

使用严格;
使用“全部”警告;
我的$rep;
而(){
$rep=$1如果/\([^()]+)\)/;
s/destination/$rep/g(如果定义为$rep);
印刷品;
}
__资料__
下面是我需要在大括号中选择的单词(WORD1)
第二线
第三行
第四行
我希望它替换的路径/root/usr/destination/
再多几行
下面是我需要在大括号中选择的单词(WORD2)
第二线
第三行
第四行
我希望它替换的路径/root/usr/destination/
再多几行
下面是我需要在大括号中选择的单词(WORD3)
第二线
第三行
第四行
我希望它替换的路径/root/usr/destination/
再多几行
输出
这里是我需要在大括号中选择的单词(WORD1)
第二线
第三行
第四行
我希望它替换的路径/root/usr/WORD1/
再多几行
下面是我需要在大括号中选择的单词(WORD2)
第二线
第三行
第四行
我希望它替换的路径/root/usr/WORD2/
再多几行
下面是我需要在大括号中选择的单词(WORD3)
第二线
第三行
第四行
我希望它替换的路径/root/usr/WORD3/
再多几行
虽然我建议不要使用它们,但这种单行程序版本是

perl-pe'$rep=$1if/\([^()]+)\)/;s/destination/$rep/g如果定义为$rep;'我的文件

这是Awk基础课程第一课或第二课的教科书示例。找到现有的代码示例应该不难。认识到你的行序列构成了相关字段的“记录”。这是一个来自Awk基础课程第一或第二课的教科书示例。找到现有的代码examp应该不难