![需要 Sed 命令的多次替换帮助](https://linux22.com/image/229304/%E9%9C%80%E8%A6%81%20Sed%20%E5%91%BD%E4%BB%A4%E7%9A%84%E5%A4%9A%E6%AC%A1%E6%9B%BF%E6%8D%A2%E5%B8%AE%E5%8A%A9.png)
我需要一个带有 sed 命令的文件 我有一个这样的文件
amb/eng/hello.amb
我需要输出如下
amx/eng/hello.amx
amx-grk/eng/hello.amx
有人可以帮助我吗?
答案1
你可以使用sed -e 's/amb/amx/gp' -e 's/amx/&-grk/' yourfile
.
前任。
$ echo 'amb/eng/hello.amb' | sed -e 's/amb/amx/gp' -e 's/amx/&-grk/'
amx/eng/hello.amx
amx-grk/eng/hello.amx
答案2
这类似于钢铁司机的回答,但匹配稍微严格一些。
$ sed '\,^amb/\(.*\)\.amb$, { s,,amx/\1.amx,p; s/amx/&-grk/; }' file
amx/eng/hello.amx
amx-grk/eng/hello.amx
在上面的命令中,我们假设我们正在查找以 开头amb/
和结尾的行.amb
。当找到这样的行时,执行的初始替换命令将这两个子字符串分别更改为amx/
和.amx
,然后输出修改后的行。第二次替换将初始amx
字符串(我们知道它出现在行的开头)更改为amx-grk
。第二次修改的结果由循环结束时的默认输出输出。
我在脚本开头使用逗号作为触发正则表达式的分隔符sed
,并s
在大括号内的表达式组内使用命令,因为我想在命令中包含斜杠。
编写此精确命令的另一种方法是使用b
(“branch”) 作为不是修改与初始正则表达式不匹配的任何行。这允许我们将命令编写为三个单独的表达式:
$ sed -e '\,^amb/\(.*\)\.amb$, !b' -e 's,,amx/\1.amx,p' -e 's/amx/&-grk/' file
amx/eng/hello.amx
amx-grk/eng/hello.amx
答案3
您可以尝试以下操作:
sed 's/amb/amx/g' | awk -F'/' '{print $1"/"$2"/"$3 " " $1"-grk/"$2"/"$3}'
例如
$ echo 'amb/eng/hello.amb' | sed 's/amb/amx/g' | awk -F'/' '{print $1"/"$2"/"$3 " " $1"-grk/"$2"/"$3}'
amx/eng/hello.amx amx-grk/eng/hello.amx