如何在 Sed/Grep/... 中包含冒号之前的所有内容?

如何在 Sed/Grep/... 中包含冒号之前的所有内容?

代码

sed -n 's/.*tex:/[preventColonFromResult]/p' ./BitTorrentSync/Gyn/1.12.2015.tex:  Agents in young <40yr?

在哪里

  • 输入是./BitTorrentSync/Gyn/1.12.2015.tex: Agents in young <40yr?.
  • 预期输出是./BitTorrentSync/Gyn/1.12.2015.tex.

我认为-n这里没有意义,因为我想将输出传递给less.我搜索了匹配项.*tex:,但它实际上不应该包含:在结果中。我保留p在最后不做更换。

DonCristi 的输出grep

尝试:在没有/ /grep种子的冒号处进行分割... GNU Grep 2.23 中的代码sedgrep

find . -name "*.tex" -exec ggrep -i -oP '^[^:]*(?=:)' {} \; | less

输出不成功,输出为文件内容,而不是文件名。该命令实际上只包含文件内容,而忽略了文件名。


如何获取:SED/Grep/... 中冒号之前的所有内容?

答案1

  1. sed对 stdin 进行操作,而不是对其参数进行操作,除非您为其指定文件名。
  2. 指定要删除的内容比指定要保留的内容更容易sed

代替

sed -n 's/.*tex:/[preventColonFromResult]/p' ./BitTorrentSync/Gyn/1.12.2015.tex:  Agents in young <40yr?

也许你的意思是

printf '%s\n' './BitTorrentSync/Gyn/1.12.2015.tex:  Agents in young <40yr?' | sed 's/:.*//'

但对于这个特定的用例,您也可以只使用单一用途的工具,即cut

printf '%s\n' './BitTorrentSync/Gyn/1.12.2015.tex:  Agents in young <40yr?' | cut -d: -f1

答案2

如果您花时间阅读grep手册,您会找到该l选项

-l, --files-with-matches
       Suppress normal output; instead print the name of each input file from which  output would normally
       have been printed. The scanning will stop on the first match.

你的find命令看起来像

find . -name "*.tex" -exec grep -il "agent" {} \; | less

或更快

find . -name "*.tex" -exec grep -il "agent" {} + | less

答案3

如果您决定在 sed 中执行此操作并匹配tex:而不是 just :,您也可以尝试:

echo "./BitTorrentSync/Gyn/1.12.2015.tex:  Agents in young <40yr?" | sed 's/\(^.*tex\):.*/\1/'

答案4

$ abc="./BitTorrentSync/Gyn/1.12.2015.tex:  Agents in young <40yr?"
$ pqr=$(echo "$abc" | sed -e 's/:.*//')
$ echo $pqr
./BitTorrentSync/Gyn/1.12.2015.tex

这对我有用。

相关内容