如何在bash中的字符后删除所有文本?

Nat*_*tan 126 bash

如何在bash中删除字符后的所有文本,在本例中为冒号(":")?我也可以取出结肠吗?我不知道怎么做.

Pau*_*ce. 233

在Bash(以及ksh,zsh,dash等)中,您可以使用参数扩展%来删除字符串末尾的字符或#从字符串的开头删除字符.如果您使用这些字符中的单个字符,则将删除最小的匹配字符串.如果你加倍角色,最长的将被删除.

$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow
Run Code Online (Sandbox Code Playgroud)

  • 这是本机shell字符串操作,因此不会生成其他进程.参考[Bash参数替换](http://tldp.org/LDP/abs/html/parameter-substitution.html#PARAMSUBREF),[Bash String Manipulation](http://tldp.org/LDP/abs/html/ string-manipulation.html)和[Better Bash Scripting](http://robertmuth.blogspot.jp/2012/08/better-bash-scripting-in-15-minutes.html) (6认同)

Eld*_*Mor 124

一个例子可能有用,但如果我理解正确,这将有效:

echo "Hello: world" | cut -f1 -d":"
Run Code Online (Sandbox Code Playgroud)

这会将"hello:world"转换为"hello".

  • `cut`有效,但我丹尼斯的答案更好,更灵活.有谁知道它是否会产生像`cut`这样的新流程? (5认同)
  • 最好使用Bash的内置参数扩展功能,而不是生成运行`basename`和`cut`等工具的子shell,请参阅下面的Dennis的答案 (3认同)
  • `cut` 可以从标准输入读取,所以它更好,特别是当你需要处理一个很长的字符串时,比如文件的内容。 (2认同)
  • 以及如何将其应用于“hello: world”。这是一半的答案。 (2认同)

Kap*_*myc 13

我知道一些解决方案:

# Our mock data:
A=user:mail:password
Run Code Online (Sandbox Code Playgroud)
  1. 使用awk和管道:
$ echo $A | awk -v FS=':' '{print $1}'
user
Run Code Online (Sandbox Code Playgroud)
  1. 通过bash 变量
$ echo ${A%%:*}
user
Run Code Online (Sandbox Code Playgroud)
  1. 使用管道和sed
$ echo $A | sed 's#:.*##g'
user
Run Code Online (Sandbox Code Playgroud)
  1. 使用管道和grep
$ echo $A | egrep -o '^[^:]+'
user
Run Code Online (Sandbox Code Playgroud)
  1. 带管和切割
$ echo $A | cut -f1 -d\: 
user
Run Code Online (Sandbox Code Playgroud)


cdh*_*wie 7

egrep -o '^[^:]*:'
Run Code Online (Sandbox Code Playgroud)

  • `egrep` 是带有 `-E` 的 grep。它与常规的“grep”没有区别。`-o` 指示 grep 仅打印行中与表达式匹配的部分。`^` 将匹配锚定到行的开头。`[^:]*` 匹配零个或多个不是 `:` 字符的字符。`:` 匹配字符 `:`。 (3认同)

sk8*_*123 6

$ echo 'hello:world:again' |sed 's/:.*//'
hello
Run Code Online (Sandbox Code Playgroud)