如何在 bash 中提取文件的第一句话



我想在 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?

最新更新