如何通过命令行使用正则表达式从字符 7 - 17 中提取字符串的特定部分?
我的字符串是ThisString
,在文件数据中我有很多字符串,但我只需要ThisString
而不是整行Value: ThisString5NotThis
Value: ThisString5NotThis
Details: other_str
Number: xxx
Value: ThisString5NotThis
Details: other_str
Number: xxx
Value: ThisString5NotThis
Details: other_str
Number: xxx
Value: ThisString5NotThis
Details: other_str
Number: xxx
目前,我已经使用了findstr
,但它会提取整个行和整个字符串
FindStr Value: "data.txt" > "done.txt"
sed
或者是否有另一个工具可以通过 Cygwin将字符串的一部分从一个文件提取到另一个文件?
答案1
我在您上面评论中提供的屏幕截图中看到您正在使用 Notepad++。
以下是完成这项工作的方法:
- Ctrl+H
- 找什么:
^Value: (.{10}).+?(?=\RValue|\z)
- 用。。。来代替:
$1
- 查看 相符
- 查看 环绕
- 查看 正则表达式
- 查看
. matches newline
- Replace all
解释:
^ # beginning of line
Value: # literally "Value: " (with a space)
(.{10}) # group 1, 10 any characters
.+? # 1 or more any characters
(?= # positive lookahead, make sure we have after:
\R # any kind of linebreak (i.e. \r, \n, \r\n)
Value # literally
| # OR
\z # end of file
) # end lookahead
替代品:
$1 # content of group 1, the data to keep
截图(之前):
截图(之后):
答案2
好吧,我首先想到的是:
grep "^Value: " data.txt | sed 's/^.\{7\}//' | sed 's/\(.\{10\}\).*/\1/'
- grep:仅以“Value:”开头的行
- sed 1:删除前 7 个字符
- sed 2:找到两个长度为 10 个字符的子字符串,其余的都替换为第一个子字符串。
添加
汤姆评论“为什么此命令会删除回车符 CR 而只留下 LF(换行符)。”
迦勒的回答
因为 .* 通配符也匹配 CR 字符。您可以简单地再次添加它:grep "^Value: " test.txt | sed 's/^.\{7\}//' | sed 's/\(.\{10\}\).*/\1\x0d/'