首页 > 解决方案 > sed 命令的 bash 等效项

问题描述

我正在用 bash 编写脚本,我想知道是否有另一种方法来编写这些 sed 命令(不使用 sed):

sed '1,11d;$d' "${SOTTOCARTELLA}"/file
sed '1,11!d' "${SOTTOCARTELLA}"/file
sed '1,11d' -i "${SOTTOCARTELLA}"/file1

标签: bash

解决方案


sed '1,11!d' "${SOTTOCARTELLA}"/file您一起询问文件的前 11 行;

sed '1,11d' -i "${SOTTOCARTELLA}"/file1您要求提供除前 11 行之外的整个文件。

如果您不想使用head,tail或建议的其他二进制文件,您可以使用read和一些支持变量来实现相同的选项。

例如,让我们尝试sed '1,11!d' "${SOTTOCARTELLA}"/file. 您将需要一个起点和一个终点(当然还有文件)。

start=1
end=11
counter="$((start - 1))";
file="${SOTTOCARTELLA}/file"
exec 3<"${file}" ### Create file descriptor 3
while IFS= read -r line <&3; do ### Read file line by line
  if [ "${counter}" -lt "${end}" ]; then ### If I'm in my "bundaries"
    printf "%s\n" "${line}" ### Print the line
  fi
  counter="$((counter + 1))"
done
exec 3>&- ### Close file descriptor 3

请注意,这段代码可能会更好(例如在 while 条件下在计数器上添加一个控件),但这是您至少需要了解两件事:

  • sed, head, tails,awk等是为了避免一遍又一遍地重写相同的例程以及性能问题而诞生的;这就是为什么每个人,包括我,都会告诉你使用这些。
  • 这种代码仅对可移植性问题有用,这就是我以符合 posix 的方式编写这段代码的原因。

推荐阅读