如何从字符 7 到 17 提取字符串的特定部分并将其保存在新的 txt 文件中(findstr、gnu32-sed 或其他工具)

如何从字符 7 到 17 提取字符串的特定部分并将其保存在新的 txt 文件中(findstr、gnu32-sed 或其他工具)

如何通过命令行使用正则表达式从字符 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/'

相关内容