bash,在冒号前提取字符串

use*_*171 39 string bash substring sed

如果我有一个像这样的行的文件

/some/random/file.csv:some string
/some/random/file2.csv:some string2
Run Code Online (Sandbox Code Playgroud)

有没有办法获得一个只有冒号之前的第一部分的文件,例如

/some/random/file.csv
/some/random/file2.csv
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用bash one liner,但perl或python也可以.

ray*_*ray 68

cut -d: -f1
Run Code Online (Sandbox Code Playgroud)

要么

awk -F: '{print $1}'
Run Code Online (Sandbox Code Playgroud)

要么

sed 's/:.*//'
Run Code Online (Sandbox Code Playgroud)

  • 哈哈,我是个白痴,忘记了 cut,只花了 10 分钟尝试做这个正则表达式,然后当我读到你的答案时,我真的捂住了脸,谢谢。 (2认同)

anu*_*ava 47

另一种纯粹的BASH方式:

> s='/some/random/file.csv:some string'
> echo "${s%%:*}"
/some/random/file.csv
Run Code Online (Sandbox Code Playgroud)

  • 如果变量中有多个冒号,这将不会按预期工作,因为它在最后一次出现时切割,而不是在第一次出现时切割...使用 <code>${s%%:*}<code> 代替 (2认同)
  • 是的,`%%`会更适合。现在已编辑。 (2认同)

Mar*_*ell 20

在纯粹的bash中尝试这个:

FRED="/some/random/file.csv:some string"
a=${FRED%:*}
echo $a
Run Code Online (Sandbox Code Playgroud)

是一些有用的文档.

  • 实际上,情况恰恰相反:“%%”提取到第一个,“%”提取到最后一个。 (9认同)

Goo*_*ans 7

这对我有用,你们可以尝试一下

INPUT='ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash'
SUBSTRING=$(echo $INPUT| cut -d: -f1)
echo $SUBSTRING
Run Code Online (Sandbox Code Playgroud)


Jot*_*tne 5

这个问题已经被问了很多次了,以至于一个超过 1000 分的用户问这个问题有点奇怪
,但只是为了展示另一种方法:

echo "/some/random/file.csv:some string" | awk '{sub(/:.*/,x)}1'
/some/random/file.csv
Run Code Online (Sandbox Code Playgroud)