【问题标题】:Shell script cut the beginning and the end of a fileShell脚本剪切文件的开头和结尾
【发布时间】:2013-04-13 11:30:16
【问题描述】:

所以我有一个文件,我想剪掉它的前 33 行和最后 6 行。我想要做的是在 cat 命令(cat 文件)中获取整个文件,然后使用“head”和“tail”命令删除这些部分,但我不知道该怎么做。 例如(这只是想法)

cat file - head -n 33 file - tail -n 6 file

我该怎么做呢?是否可以使用“sed”(如何)来做到这一点?提前致谢。

【问题讨论】:

  • 您可以使用sed 轻松删除前 33 行:sed '1,33d' filesed 不能做的是从最后一行(或当前行)倒数,所以“最后 6 行”部分不能用 sed 明智地解决。 (你可以通过保持空间和模式空间经历非凡的旋转,但最好不要去探索它们。)
  • @JonathanLeffler 已经用sed 回答了它,但没有使用保留空间。不过,我明白你的意思。
  • @StevenPenny:我没有在心理上完成sed 脚​​本,是的,有一个解决方案适用于 33 和 6 的情况,只需要模式空间(所以我把它复杂化了)。但是,将处理 25 和 20 的解决方案概括为sed-script 生成中的一个混乱练习,并且处理 200 和 250 不值得考虑。从这个角度来看,使用tail 获取除前 N 行之外的所有行,使用head 获取除最后 M 行之外的所有行更好(至少您只需调整一个整数值)。

标签: file shell sed cut


【解决方案1】:

这可能就是你想要的:

$ tail -n +34 file | head -n -6

tail

-n, --lines=K 输出最后 K 行,而不是最后 10 行;或使用 -n +K 输出以第 K 个开头的行

head

-n, --lines=[-]K 打印前 K 行而不是前 10 行;使用前导“-”,打印每个文件的最后 K 行以外的所有行

手册页。

例子:

$ cat file
one
two
three
four
five
six
seven
eight

$ tail -n +4 file | head -n -2
four
five
six

请注意,您不需要cat(请参阅UUOC)。

【讨论】:

    【解决方案2】:

    先统计总行数,再打印中间部分:(两次读取文件)

    l=$(wc -l file)
    awk -v l="$l" 'NR>33&&NR<l-6' file
    

    或将文件加载到数组中,然后打印您需要的行:(读取文件一次)

    awk '{a[NR]=$0}END{for(i=34;i<NR-6;i++)print a[i]}' file
    

    or awk with head,别这么想:(两次读取文件)

    awk 'NR>33' file|head -n-6
    

    【讨论】:

      【解决方案3】:
       sed -n '1,33b; 34{N;N;N;N;N};N;P;D' file
      

      这会起作用 +

      【讨论】:

        【解决方案4】:

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

        sed '1,33d;:a;$d;N;s/\n/&/6;Ta;P;D' file
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多