使用SED或AWK从文件中删除行

时间:2011-04-19 19:20:49

标签: regex shell unix sed awk

我见过许多变化,对如何解决这3个问题非常困惑。

  1. 从文件中删除除第一行以外的所有行
  2. 使用行号
  3. 从文件中删除行
  4. 从包含行号范围的文件中删除行

3 个答案:

答案 0 :(得分:27)

使用sed:

删除第1行:

sed '1d' file-name

删除第10行:

sed '10d' file-name

删除第5行到第10行

sed '5,10d' file-name

以上所有sed命令都会在stdout上写入输出,如果你想要或者使用sed的-i标志来内联编辑文件,你可以将其重定向到另一个文件。

答案 1 :(得分:7)

使用awk:

# delete line 1
awk 'NR == 1 {next} {print}' file

# delete line number stored in shell variable $n
awk -v n=$n 'NR == n {next} {print}' file

# delete between lines $a and $b inclusive
awk -v m=$a -v n=$b 'm <= NR && NR <= n {next} {print}' file

要保存一些字符,可以使用{print}

替换1

要覆盖原始文件,您必须执行以下操作

awk '...' file > tmpfile && mv tmpfile file

答案 2 :(得分:0)

如果您的系统有bash,您可以使用bash。背后的基本思想是在迭代文件时设置计数并递增此计数。

1)从文件中删除除第一行以外的所有行

read -r line < file; echo "$line" > temp && mv temp file

2)从行号

的文件中删除一行
declare -i count=0
while read -r line
do
  ((count++))
  case "$count" in
    10) continue;;
    * ) echo "$line";;
  esac
done < file > temp && mv temp file

3)从具有一系列行号的文件中删除行,例如从10到20

declare -i count=0
while read -r line
do
  ((count++))
  if (( $c < 10 && $c > 20 ));then
    echo "$line";;
  fi
done < file > temp && mv temp file