我在文件的不同行中有两个字符串/路径,如下所示,
cmd a/b/c -x -y
cmd a/b/c -x
在这两个字符串中,我只想替换第二个字符串。我曾经用来sed
替换第二个字符串,但由于命令中的错误,我正在替换这两个字符串。请让我知道sed
bash 中执行此操作的用法或任何其他命令。
答案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 变量
keep
、target
和new
分别定义 awk 变量k
、t
和n
。请注意,
k
andt
将被视为正则表达式。如果它们包含任何正则表达式活动字符,例如+
或*
,则应使用反斜杠对其进行转义。gsub(k, "\n")
这会将所有出现的 替换
k
为换行符。gsub(t, n)
这会将所有出现的目标字符串替换
t
为新字符串n
。gsub(/\n/, k)
这将恢复字符串
k
。1
这告诉 awk 打印该行。