当我的搜索包含“*”时,如何替换所有子文件夹中的所有文件中的文本,例如,我有许多包含这种模式的文本文件(我想纠正一些错误的路径)
/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
将包含要放入ini
和last
变量中的内容,即launch
然后我们按照指定的模式打印变量的值/
。