在 sed 中排除特定行的替换

在 sed 中排除特定行的替换

我想删除除特定行之外的一些标点符号。比如,我只想sed删除这些, : { } [ ]标记,但不删除第 1、4-7、38、39 行。我怎样才能实现这一目标?

答案1

您可以添加一个又一个要从替换中排除的块:

sed -e '1!{ 4,7!{ 38,39! s/[][,:{}]//g ;}' -e '}' file_in > file_out

示例(使用不同的范围以保持简短):

$ printf 'line %s , : { } [ ]\n' {1..10} | sed -e '1!{ 4,6!{ 8,9! s/[][,:{}]//g ;}' -e '}'
line 1 , : { } [ ]
line 2
line 3
line 4 , : { } [ ]
line 5 , : { } [ ]
line 6 , : { } [ ]
line 7
line 8 , : { } [ ]
line 9 , : { } [ ]
line 10

答案2

b一种方法是首先在要保留的行上使用命令:

sed -e 1b -e 4,7b -e 38,39b -e 's/[][,:{}]//g'

或者:

sed '
  1     b
  4,7   b
  38,39 b
  s/[][,:{}]//g'

使用 的 GNU 实现sed,您还可以编写它:

sed '1b;4,7b;38,39b;s/[][,:{}]//g'

答案3

使用 Perl,我们可以使用行范围通过非常低的优先级或运算符取消选择。

$ perl -pe '1..1 or 4..7 or 38..39 or tr/][,:}{//d'

其他方式:

perl -pe 'grep { $. == $_ } (1, 4..7, 38..39) or tr/[]{},://d' 

答案4

你可以用 awk 尝试类似的东西

awk '{ if (NR !~ /^(1|[4-7]|38|39)$/) { gsub(/[,:\{\}\[\]]+/,"",$0) }; print }' your-file.txt

如果 NR(行号与 1 或 4 到 7 或 38 或 39 不匹配,则用“无”替换符号。然后打印行

相关内容