我想用bash提取文件的第一句话。我使用了以下命令:
sed 's/(\?|\.|!).*//' filename
然而,它不起作用。我的正则表达式出了什么问题?
如果我在文件Stack overflow is the best? I am also the best.
中有以下句子,则输出必须为Stack overflow is the best?
注意:问号最后需要在那里。句子也可以以句号/问号/感叹号结束。
编辑:句子可能包含Mr.
等词语
答案 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?
正则表达式包含以下组件:
^
锚定到行的开头[^.!?]*
除.
,!
或?
[.!?]
.
,!
或?
答案 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