如何删除与模式匹配的特定数量的随机行

时间:2014-10-13 19:02:43

标签: regex linux bash vim sed

我有一个带有网格的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上从终端运行这些命令并且对语法缺乏经验,因此格式化命令是理想的。

2 个答案:

答案 0 :(得分:1)

删除包含&#34的每一行;使用"概率为10%:

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

随机删除一行包含"使用":

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的其中一行。

答案 1 :(得分:0)

这可能适合你:( GNU sed& sort):

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

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