将所有字符替换为空格,直到遇到第一个 /

将所有字符替换为空格,直到遇到第一个 /

这是字符串(它是 shell 变量的值):

2908104 /var/cache/yum/x86_64/7Server/Patches/gen

预期输出:

/var/cache/yum/x86_64/7Server/Patches/gen

如何仅检索从第一个 / 开始的值?我是 sed 的新手,也是 Linux 的初学者。

答案1

通过使用 Linux 作为内核的系统上常见的实现grep(RHEL 和其他通用 GNU/Linux 发行版上的 GNU、大多数基于 Linux 的系统上的 busybox、Android 上的 toybox),您可以执行以下操作:

LC_ALL=C grep -o '/.*' <input

/对于至少有一个的行,打印从第一行开始的部分。

POSIXly:

LC_ALL=C sed -n 's|^[^/]*/|/|p' <input

如果字符串存储在类似 POSIX 的 shell 中的 shell 变量中(例如sh实际上处于bashPOSIX 模式的 RHEL)。

new_string=${string#"${string%%/*}"}

(如果不包含任何内容,$new_string则为空)$string/

${string%%/*}删除匹配的最长后缀/*。结果又被视为${string#pattern}删除与该模式匹配的最短前缀的模式。在这里,正如${string%%/*}所引用的那样,它被视为文字字符串而不是模式。

使用zsh,您还可以执行以下操作:

new_string=${(M)string%%/*}

随着M 参数扩展标志,所有这些${string#pattern}(或##:#%%%)运算符不是删除匹配部分,而是扩展到M附加部分(没有它就会被删除的部分)。

您还可以删除所有前导非 / 字符:

  • zsh

    set -o extendedglob
    new_string=${string##[^/]#}
    
  • ksh93/ bash -O extglob

    new_string=${string##*([^/])}
    

其中X#(zsh) 或*(X)(ksh) 匹配 0 个或多个s,相当于以上使用的正X则表达式。X*grepsed


1 通常嵌入在智能灯泡、电视或网络设备中,因此最终用户很少与他们的 shell 和实用程序进行交互(当他们拥有 shell 和实用程序时)。

答案2

要删除 shell 变量值的初始部分,直到(并包括)第一个空格:

var=${var#* }

*这会删除变量中与shell 模式(“星形空间”)匹配的最短前缀字符串var。另请参阅外壳参数扩展Bash 手册的部分,或者参数扩展POSIX 标准的部分。

例子:

$ var='2908104 /var/cache/yum/x86_64/7Server/Patches/gen'
$ var=${var#* }
$ printf 'var is "%s"\n' "$var"
var is "/var/cache/yum/x86_64/7Server/Patches/gen"

或者,更短(如果不需要对变量进行实际更改),

$ var='2908104 /var/cache/yum/x86_64/7Server/Patches/gen'
$ printf 'The trimmed value of var is "%s"\n' "${var#* }"
The trimmed value of var is "/var/cache/yum/x86_64/7Server/Patches/gen"

如果您想要隔离的字符串之前有多个空格,并且您实际上需要使用/,那么请考虑使用中概述的方法斯特凡·查泽拉斯的回答,复制在这里:

var=${var#"${var%%/*}"}

相关内容