高级文本替换

高级文本替换

当我的搜索包含“*”时,如何替换所有子文件夹中的所有文件中的文本,例如,我有许多包含这种模式的文本文件(我想纠正一些错误的路径)

/folder1/(abc)/params.launch
/folder2/(efd)/gui.launch
/folder3/(ghi)/robot.launch

现在我想在每个文件前添加 /launch 来得到这样的结果

/folder1/(abc)/launch/params.launch
/folder2/(efd)/launch/gui.launch
/folder3/(ghi)/launch/robot.launch

我想过寻找字符串模式

")/*.launch"

但是我怎样才能替换它,同时保留那些“*”的内容

答案1

应该相当简单sed

sed 's;\([^/]*.launch$\);launch/\1;'
  • 您可以通过将表达式括在括号 ( \( ... \)) 中来对匹配的文本进行分组。您需要转义括号,以使其sed被视为特殊语法。
  • 可以使用位置来引用组 - 第一组是\1,第二组是\2,等等。

示例输出:

$ sed 's;\([^/]*.launch\);launch/\1;' foo   
/folder1/(abc)/launch/params.launch
/folder2/(efd)/launch/gui.launch
/folder3/(ghi)/launch/robot.launch

这是基本正则表达式。对于扩展正则表达式,可以使用sed -r,在这种情况下括号不需要转义:

sed -r 's;([^/]*.launch);launch/\1;'

最后,在sed和一些其他工具中,可以使用 引用完整的匹配文本&,从而完全避免了对组和反向引用的需要:

sed 's;[^/]*.launch;launch/&;' foo

答案2

使用bash

#!/bin/bash
while IFS= read -r line; do
  ini="${line%/*}"
  last="${line##*/}"
  repl="${line##*.}"
      echo "${ini}/${repl}/${last}"
done <file.txt

输出 :

/folder1/(abc)/launch/params.launch
/folder2/(efd)/launch/gui.launch
/folder3/(ghi)/launch/robot.launch

这里我们使用了参数替换bash三个变量:

  • ini变量将包含倒数第二部分/,例如/folder1/(abc)

  • last变量将包含最后一个之后的部分/,例如params.launch

  • 变量repl将包含要放入inilast变量中的内容,即launch

然后我们按照指定的模式打印变量的值/

相关内容