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

时间:2018-01-10 13:06:07

标签: regex bash

我想用bash提取文件的第一句话。我使用了以下命令:

sed 's/(\?|\.|!).*//' filename

然而,它不起作用。我的正则表达式出了什么问题?

如果我在文件Stack overflow is the best? I am also the best.中有以下句子,则输出必须为Stack overflow is the best?

注意:问号最后需要在那里。句子也可以以句号/问号/感叹号结束。

编辑:句子可能包含Mr.等词语

4 个答案:

答案 0 :(得分:1)

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

我的解决方案会找到:

(首先?找到之前的任何符号首先.找到之前的任何符号第一个之前的任何符号{ {1}}找到!之后的任何符号。> print在括号中找到“。

答案 1 :(得分:1)

我认为你不符合该行的开头。我的解决方案是:

^.*?[.?!]

这意味着:

  • ^:匹配必须位于行的开头
  • 。*? :任意数量的字符(贪婪,尽可能少)
  • [。?!]]:匹配[]
  • 中的一个字符

工作示例here

请注意,解决方案是为python工作。我想there are no greedy searches with sed

答案 2 :(得分:1)

如果输入文件只包含一行,则可以使用

$ grep -o '^[^.!?]*[.!?]' <<< 'Stack overflow is the best? I am also the best.'
Stack overflow is the best?

如果有多行并且您的第一句话可能跨越多行,则可以使用-z与GNU grep将该文件视为一行:

$ grep -zo '^[^.!?]*[.!?]' <<< $'Stack overflow\nis the best? I am also the best.'
Stack overflow
is the best?

正则表达式包含以下组件:

  • ^锚定到行的开头
  • [^.!?]*.!?
  • 以外的零个或多个字符 {li> [.!?] .!?

答案 3 :(得分:0)

如果您的实际Input_file与显示的示例相同,那么关注@IBAction func btnFacebookSignInTapped(_ sender: UIButton) { let fbManager = FBSDKLoginManager() fbManager.logIn(withReadPermissions: ["public_profile", "email"], from: self) { (result, error) in if let loginResult = result, error == nil { if let permissions = loginResult.grantedPermissions { if permissions.contains("email") || permissions.contains("public_profile") { if FBSDKAccessToken.current() != nil { FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, email"]).start(completionHandler: { (connection, graphResult, error) in if error == nil { debugPrint("Result: \(graphResult!)") if let data = graphResult as? [String: Any] { print("User details from FB: \(data)") } } }) } else { print("Invalid FB access token"); } } } else { print("Fail to login using facebook.") } } else { print("Error in facebook login") } } } 可能对您有帮助。

sed

输出如下。

sed 's/[\?\.\!].*/\?/'   Input_file