【问题标题】:How to delete a specific number of random lines matching a pattern如何删除与模式匹配的特定数量的随机行
【发布时间】:2014-12-08 10:27:55
【问题描述】:

我有一个 svg 文件,其中有一个由线条表示的点网格,其中包含单词 use。我想删除与use 模式匹配的特定数量的随机行,然后保存文件的新版本。 This answer 非常接近。

所以会是这个的组合(在特定范围内随机删除一行):

sed -i '.svg' $((9 + RANDOM % 579))d /filename.svg 

还有这个(删除所有匹配模式use的行):

sed -i '.svg' /use/d /filename.svg

换句话说,逻辑是这样的:

sed -i delete 'x' number of RANDOM lines matching 'use' from 'input.svg' and save to 'output.svg'

我在 Mac 上从终端运行这些命令,并且对语法缺乏经验,因此格式化命令将是理想的。

【问题讨论】:

    标签: regex linux bash vim sed


    【解决方案1】:

    以 10% 的概率删除包含“use”的每一行:

    awk '!/use/ || rand() > 0.10' file
    

    随机删除一行包含“use”的行:

    awk -v n="$(( RANDOM % $(grep -c "use" file) ))" '!/use/ || n-- != 0' file
    

    这是一个调用示例:

    $ cat file
    some string
    a line containing "use"
    another use-ful line
    more random data
    
    $ awk -v n="$(( RANDOM % $(grep -c "use" file) ))" '!/use/ || n-- != 0' file
    some string
    another use-ful line
    more random data
    

    删除了包含use 的行。

    【讨论】:

    • 这些似乎只返回包含“使用”的所有行的巨大列表
    • @substancejoy 后一个有错别字。
    • 嗯,现在第二个打印整个文件
    • @substancejoy 我添加了一个示例运行。尝试完全复制粘贴它,看看它是否仍然不起作用(在测试之前不要尝试调整它)。
    • 好的,成功了!测试打印完全符合预期,它也适用于 svg 文件。但是,我需要它修改实际文件或使用已删除的行保存文件的新副本。它还需要删除特定数量的行。
    【解决方案2】:

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

    sed -n '/\<use\>/=' file | sort -r | head -5 | sed 's/$/d/' | sed -i.bak -f - file
    

    从文件中提取包含单词use 的行的行号。对这些行号进行随机排序,然后取第一个说 5 并构建一个 sed 脚本以将它们从原始文件中删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多