如何替换bash中所有字符串中的特定子字符串?

如何替换bash中所有字符串中的特定子字符串?

我在文件的不同行中有两个字符串/路径,如下所示,

    cmd a/b/c -x -y


    cmd a/b/c -x 

在这两个字符串中,我只想替换第二个字符串。我曾经用来sed替换第二个字符串,但由于命令中的错误,我正在替换这两个字符串。请让我知道sedbash 中执行此操作的用法或任何其他命令。

答案1

sed 没有其他正则表达式引擎支持的一些良好的前瞻功能,但我们仍然可以做您想做的事情。尝试:

sed 's@cmd a/b/c -x -y@\n@g; s@cmd a/b/c -x@New String@g; s@\n@cmd a/b/c -x -y@'

例子

$ cat file
(1). cmd a/b/c -x -y (2). cmd a/b/c -x
$ sed 's@cmd a/b/c -x -y@\n@g; s@cmd a/b/c -x@New String@g; s@\n@cmd a/b/c -x -y@' file
(1). cmd a/b/c -x -y (2). New String

怎么运行的

  • s@cmd a/b/c -x -y@\n@g

    这将用换行符替换您不需要的字符串。

  • s@cmd a/b/c -x@New String@g

    这将完成您想要的替换。

  • s@\n@cmd a/b/c -x -y@

    这将恢复您想要不变的字符串。

使用变量

人们可以在 sed 中使用变量,但它充满了问题,包括错误、意外结果,甚至安全违规。 awk 在轻松、安全地处理变量方面做得更好。

首先,让我们创建 shell 变量:

keep='cmd a/b/c -x -y'
target='cmd a/b/c -x'
new='New String'

现在,让我们运行 awk 命令:

$ awk -v k="$keep" -v t="$target" -v n="$new" '{gsub(k, "\n"); gsub(t, n); gsub(/\n/, k)} 1' file
(1). cmd a/b/c -x -y (2). New String

awk 命令的逻辑与 sed 完全相同。

怎么运行的:

  • -v k="$keep" -v t="$target" -v n="$new"

    这些选项使用 shell 变量keeptargetnew分别定义 awk 变量ktn

    请注意,kandt将被视为正则表达式。如果它们包含任何正则表达式活动字符,例如+*,则应使用反斜杠对其进行转义。

  • gsub(k, "\n")

    这会将所有出现的 替换k为换行符。

  • gsub(t, n)

    这会将所有出现的目标字符串替换t为新字符串n

  • gsub(/\n/, k)

    这将恢复字符串k

  • 1

    这告诉 awk 打印该行。

相关内容