如何删除字符后的所有文本,在这种情况下,冒号(“:”),在bash?我能把结肠也切除吗?我不知道该怎么做。


egrep -o '^[^:]*:'

举个例子可能有用,但如果我理解正确的话,这是可行的:

echo "Hello: world" | cut -f1 -d":"

这将把Hello: world转换为Hello。


在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

$ echo 'hello:world:again' |sed 's/:.*//'
hello

假设你有一个这样格式的文件路径:

/dirA/dirB/dirC/filename.file

现在您只需要包含四个“/”的路径。类型

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"

你的输出将是

/dirA/dirB/dirC

使用cut的优点是,您还可以删除最上面的目录以及文件(在本例中),因此如果您键入

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"

你的输出是

/dirA/dirB

虽然您可以从字符串的另一端执行相同的操作,但在这种情况下,它没有键入那么有意义

$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"

结果

dirA/dirB/dirC

在其他一些情况下,最后一种情况也可能有用。注意,在最后一个输出的开头没有“/”。


删除":"最后一个实例之后的所有内容

grep -o '^.*:' fileListingPathsAndFiles.txt

如果你想去掉最后一个":"

grep -o '^.*:' file.txt | sed 's/:$//'

@kp123:你想用/替换:(其中sed冒号应该是\/)


我知道一些解决办法:

# Our mock data:
A=user:mail:password

使用awk和pipe:

$ echo $A | awk -v FS=':' '{print $1}'
user

通过bash变量:

$ echo ${A%%:*}
user

带管和sed:

$ echo $A | sed 's#:.*##g'
user

使用pipe和grep:

$ echo $A | egrep -o '^[^:]+'
user

带管切:

$ echo $A | cut -f1 -d\: 
user