【问题标题】:How do I extract everything from the start of a line to a specific string?如何提取从行首到特定字符串的所有内容?
【发布时间】:2014-06-04 05:04:55
【问题描述】:

我已经为此工作了几天,似乎无法弄清楚,希望有人能提供帮助。我更喜欢可以在 linux 命令行中运行的答案,例如 grep、sed、awk 等。

假设我有一个名为“file.txt”的文件,内容如下:

1234jpg.jpg a.jpgbjpgy.jpg uyapss.jpg>"sdf
5678jpg.jpga.jpgbjpgy.jpg uyapss.jpg>"sdf
ABC not this line

我想要做的是将所有内容提取到“.jpg”,这会给我以下结果:

1234jpg.jpg
5678jpg.jpg

我尝试过的一些命令(在数百个其他变体中)是:

cat file.txt | sed 's/\(^.*\.jpg\)/\1/'

cat file.txt | sed -e 's/^[^"jpg"]\(.*\.jpg\)/\1/'

cat file.txt | egrep '^([^jpg]*[jpg])'

cat file.txt | grep -Po '\(\K.*jpg\)'

cat file.txt | grep -Po '(?<=\.jpg).*'

我很乐意为此提供任何帮助。

肖恩

【问题讨论】:

  • 你也可以使用grep。说grep -Po '.*?\.jpg' file.txt
  • 此命令无效。它使 .jpg 之后的所有内容都在一个新行上,这给了我 8 个 .jpg 文件名,而不是在行开头的 2 个 .jpg 文件名与 .jpg 的第一个匹配项。
  • 我没有意识到命令中的锚点丢失了。应该是grep -Po '^.*?\.jpg' file.txt
  • 绝对完美!!!

标签: regex linux replace sed grep


【解决方案1】:

这可能对你有用(GNU sed):

sed 's/\(\.jpg\).*/\1/' file

或:

sed -r 's/(\.jpg).*/\1/' file

或:

sed 's/\.jpg.*/.jpg/' file

【讨论】:

  • 如果我重定向输出以仅过滤掉带有 .jpg 的行,所有这些命令都有效。 sed 's/(\.jpg).*/\1/' 文件 | grep "\.jpg" 谢谢!
【解决方案2】:

试试这个:

$ awk -F"[.]jpg" 'NF>1{print $1".jpg"}' file
1234jpg.jpg
5678jpg.jpg

我们使用.jpg 作为字段分隔符来分割行。我们只选择具有多个此类文件的行并打印第一个元素。我们打印扩展名,以便输出作为您想要的输出返回。

【讨论】:

  • 是的,这正是我想要的,谢谢!我可以发布超过 2000 条我试图让它工作的命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
相关资源
最近更新 更多