假设我有一行看起来像这样:
/Users/random/354765478/Tests/StoreTests/Base64Tests.swift
在这个例子中,我想得到结果:
Tests/StoreTests/Base64Tests.swift
如果我想在第一次模式匹配(Sources
或 Tests
)之前使用 sed 或 获取所有内容,我该怎么做>awk?
我现在正在使用 sed 's/^.*\(Tests.*\).*$/\1/'
但它正在下降:
echo '/Users/random/354765478/Tests/StoreTests/Base64Tests.swift' | sed 's/^.*\(Tests\)/\1/'
Tests.swift
这是另一个使用 Sources 的例子(似乎可行):
echo '/Users/random/741672469/Sources/Store/StoreDataSource.swift' | sed 's/^.*\(Sources\)/\1/'
Sources/Store/StoreDataSource.swift
我想在第一个之前获取所有内容,而不是最后一个Sources 或Tests 模式匹配。
如有任何帮助,我们将不胜感激!
最佳答案
How can I do if I want to get everything before the first pattern match (either
Sources
orTests
).
在这里使用 grep -o
更容易:
grep -Eo '(Sources|Tests)/.*' file
Tests/StoreTests/Base64Tests.swift
Sources/Store/StoreDataSource.swift
# where input file is
cat file
/Users/random/354765478/Tests/StoreTests/Base64Tests.swift
/Users/random/741672469/Sources/Store/StoreDataSource.swift
分割:
- 正则表达式
(Sources|Tests)/.*
匹配任何以Sources/
或Tests/
开头的文本,直到行尾. -E
:启用扩展正则表达式模式-o
:只打印匹配的文本而不是整行
或者你也可以使用这个awk
:
awk 'match($0, /(Sources|Tests)\/.*/) {
print substr($0, RSTART)
}' file
Tests/StoreTests/Base64Tests.swift
Sources/Store/StoreDataSource.swift
或者这个sed
:
sed -E 's~.*/((Sources|Tests)/.*)~\1~' file
Tests/StoreTests/Base64Tests.swift
Sources/Store/StoreDataSource.swift
关于awk - 在与 sed/awk 进行第一次模式匹配之前删除所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74641296/