【问题标题】:sed command to copy lines that have stringssed 命令复制具有字符串的行
【发布时间】:2017-09-10 17:59:07
【问题描述】:

我想将包含字符串的行复制到另一个文件中

例如

一个文件包含以下几行

ram 100 50
gopal 200 40
ravi 50 40
krishna 300 600
Govind 100 34

我想通过跳过(一行中第一次出现)100 或 200 之前的所有字符来将具有 100 或 200 的行复制到另一个文件中

我希望它复制 100 50 200 40 100 34 到另一个文件

我正在使用 sed -n '/100/p' 文件名 > 输出文件

你能帮我用一个命令添加任何一个字符串的行吗

【问题讨论】:

  • 请注意不要选择包含 51003 等的行(即数字包含 100 或 200 而不是 ARE 100 或 200)。所有当前发布的答案都会以这种方式失败。您应该更新您的示例以包含这些案例并添加预期的输出。此外,您是想在整行中搜索100,还是仅在该行的 1 或 2 个特定的空格分隔字段内搜索?如果是后者,则编辑您的示例以显示您也不想错误匹配的那些情况。找到匹配项总是微不足道的,但很难不选择不应该匹配的相似行。

标签: linux sed text-processing


【解决方案1】:

sed方法:

sed '/[12]00/!d; s/[^0-9[:space:]]*//g; s/^ *//g;' filename > outputfile
  • /[12]00/!d - 排除/删除所有与100200 不匹配的行

  • s/[^0-9[:space:]]*//g - 删除除数字和空格以外的所有字符

outputfile 内容:

100 50
200 40
100 34

【讨论】:

  • 实际上我错过了添加一些关于我的要求的细节。复制时我想跳过第一次出现 100 或 200 之前的所有字符
【解决方案2】:

这可能对你有用(GNU sed):

sed -n '/[12]00/w anotherFile' file

仅在需要时打印,将匹配100200 的正则表达式写入anotherFile

【讨论】:

    【解决方案3】:

    至少有两种可能:

    sed -n '/100\|200/p' filename > outputfile
    
    sed -n -e '/100/p' -e '/200/p' filename > outputfile
    

    后者可能更容易记住和维护(但也许你应该使用-f?),但请注意,如果它们都匹配,它将打印两次。您可以使用以下方法解决此问题:

    sed -n -e '/100/{p;b}' -e '/200/{p;b}' filename > outputfile
    

    再说一遍,你为什么要使用 sed?这听起来像是 grep 的工作。

    【讨论】:

    • 实际上我错过了添加一些关于我的要求的细节。复制时我想跳过第一次出现 100 或 200 之前的所有字符
    • 请注意,s/// 有一个 p 标志,与我的第二个答案非常相似。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2020-08-26
    • 2017-09-25
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多