这是字符串(它是 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
实际上处于bash
POSIX 模式的 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*
grep
sed
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%%/*}"}