awk - 在与 sed/awk 进行第一次模式匹配之前删除所有内容

标签 awk sed grep

假设我有一行看起来像这样:

/Users/random/354765478/Tests/StoreTests/Base64Tests.swift

在这个例子中,我想得到结果:

Tests/StoreTests/Base64Tests.swift

如果我想在第一次模式匹配(SourcesTests)之前使用 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

我想在第一个之前获取所有内容,而不是最后一个SourcesTests 模式匹配。

如有任何帮助,我们将不胜感激!

最佳答案

How can I do if I want to get everything before the first pattern match (either Sources or Tests).

在这里使用 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/

相关文章:

date - 在awk中使用mktime时如何保留毫秒信息?

linux - 在十万行分隔符的特定位置添加字符串

linux - 使用正则表达式用 sed 删除第一行

bash - 在不使用 "source"的情况下读取 BASH 中的配置文件

c - C : using awk getting runaway string constant error 中的 shell 脚本

regex - Linux:从行中提取和转换属性

linux - 替换文件中的模式,除了其中的一行

bash - 删除文件中第一次出现特定字符串之前的所有行

regex - 正则表达式[:digit:] and [[:digit]] difference

regex - 特定代码块的 Grep