我想在 bash 中提取文件的第一句话。我使用了以下命令:
sed 's/(?|.|!).*//' filename
但是,它不起作用。我的正则表达式有什么问题?
如果我在文件中有以下句子:Stack overflow is the best? I am also the best.
,输出需要Stack overflow is the best?
注意:问号需要在末尾。此外,句子可能以句号/问号/感叹号结尾。
编辑:句子可能包含Mr.
等单词
sed -r 's/([.*?]|[.*.]|[.*!]).*/1/' file
^ ^ ^ ^ ^
|_______|_____|___|__|_> Any symbols before first `?` **OR**
|_____|___|__|_> Any symbols before first `.` **OR**
|___|__|_> Any symbols before first `!`
|__|_> Any symbols
|_> Print all found symbols in first pair of brackets
我的解决方案将找到:
"(
首先找到之前的任何符号 ?
或 第一次找到之前的任何符号 .
或 第一个!
找到之前的任何符号 )
之后的任何符号。-->括号中的印刷品符号"。
我认为你与行首不匹配。我的解决方案是:
^.*?[.?!]
这意味着:
- ^ : 匹配项必须位于行首
- .*? :任意数量的字符(贪婪,也就是尽可能少(
- [.?!]]:匹配 [] 中的字符之一
这里的工作示例
请注意,该解决方案适用于python。我认为没有贪婪的搜索sed
如果您的输入文件仅包含一行,您可以使用
$ grep -o '^[^.!?]*[.!?]' <<< 'Stack overflow is the best? I am also the best.'
Stack overflow is the best?
如果有多个行,并且你的第一句话可能跨越多行,你可以使用 GNU grep -z
将文件视为一行:
$ grep -zo '^[^.!?]*[.!?]' <<< $'Stack overflownis the best? I am also the best.'
Stack overflow
is the best?
正则表达式由以下组件组成:
-
^
锚点到行首 -
[^.!?]*
除.
、!
或?
以外的零个或多个字符 -
[.!?]
.
、!
或?
如果您的实际Input_file与所示示例相同,那么遵循sed
可能会对您有所帮助。
sed 's/[?.!].*/?/' Input_file
输出将如下所示。
Stack overflow is the best?