代码
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 中的代码sed
grep
find . -name "*.tex" -exec ggrep -i -oP '^[^:]*(?=:)' {} \; | less
输出不成功,输出为文件内容,而不是文件名。该命令实际上只包含文件内容,而忽略了文件名。
如何获取:
SED/Grep/... 中冒号之前的所有内容?
答案1
sed
对 stdin 进行操作,而不是对其参数进行操作,除非您为其指定文件名。- 指定要删除的内容比指定要保留的内容更容易
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
这对我有用。