afrin Asked: 2024-02-19 15:30:24 +0800 CST2024-02-19 15:30:24 +0800 CST 2024-02-19 15:30:24 +0800 CST 需要 Sed 命令的多次替换帮助 772 我需要一个带有 sed 命令的文件 我有一个这样的文件 amb/eng/hello.amb 我需要输出如下 amx/eng/hello.amx amx-grk/eng/hello.amx 有人可以帮助我吗? text-processing 3 个回答 Voted steeldriver 2024-02-19T16:13:57+08:002024-02-19T16:13:57+08:00 你可以使用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 Kusalananda 2024-02-19T18:22:14+08:002024-02-19T18:22:14+08:00 这与steeldriver的答案类似,但匹配稍微严格一些。 $ 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在大括号内的表达式组内使用命令,因为我想在命令中包含斜杠。 编写此精确命令的另一种方法是使用(“branch”) 作为不修改任何与初始正则表达式不匹配的行b的方法。这允许我们将命令编写为三个单独的表达式: $ 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 Best Answer dgfjxcv 2024-02-19T15:51:14+08:002024-02-19T15:51:14+08:00 您可以尝试以下操作: 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
你可以使用
sed -e 's/amb/amx/gp' -e 's/amx/&-grk/' yourfile
.前任。
这与steeldriver的答案类似,但匹配稍微严格一些。
在上面的命令中,我们假设我们正在查找以 开头
amb/
和结尾的行.amb
。当找到这样的行时,执行的初始替换命令将这两个子字符串分别更改为amx/
和.amx
,然后输出修改后的行。第二次替换将初始amx
字符串(我们知道它出现在行的开头)更改为amx-grk
。第二次修改的结果由循环结束时的默认输出输出。我在脚本开头使用逗号作为触发正则表达式的分隔符
sed
,并s
在大括号内的表达式组内使用命令,因为我想在命令中包含斜杠。编写此精确命令的另一种方法是使用(“branch”) 作为不修改任何与初始正则表达式不匹配的行
b
的方法。这允许我们将命令编写为三个单独的表达式:您可以尝试以下操作:
例如