【问题标题】:Remove first N and last M characters of a file删除文件的前 N ​​和最后 M 个字符
【发布时间】:2021-06-25 06:05:15
【问题描述】:

假设我有一个仅包含一行的文件,其长度可能会有所不同。

This is an example row

我想要: is an example

所以前 4 个字符和最后 3 个字符被修剪。

是否可以通过在 sh 中运行单个命令来实现?

【问题讨论】:

    标签: shell unix sh


    【解决方案1】:

    使用普通的 POSIX sh,您可以执行以下操作:

    myvar=$(sed -e 's/^....//' -e 's/...$//' input.txt)
    

    使用更强大的 shell,如 bashzsh,无需借助外部程序即可完成:

    myvar=$(< input.txt)
    myvar=${myvar:4:-3}
    

    【讨论】:

    • ksh93 将使用${myvar:4:${#myvar}-7}
    【解决方案2】:

    我假设“单个命令”是指一次执行(不排除管道)。

    cat test.txt | cut -c5- | rev | cut -c4- | rev
    

    细分:

    1. 用 cat 获取文件内容
    2. 只保留第五个字符,直到最后一个带有 cut 的字符
    3. 颠倒字符顺序
    4. 只保留第四个字符(原始字符串中倒数第四个)直到最后一个字符
    5. 再次反转

    【讨论】:

      【解决方案3】:

      每行修剪前 N 个和最后 M 个字符:

      $ awk '{print substr($0,N+1,length-N-M)}' file
      $ sed 's/^\(.\)\{,N\}//;s/\(.\)^\{,M\}$//' file
      

      修剪文件的前 N ​​和最后 M 个字符

      $ awk '(FNR==1){p=substr($0,N+1);next}{print p; p=$0}END{print substr(p,1,length-M)}' file
      $ awk '{p=p ORS $0}END{print substr(p,N+2,length(p)-N-M-1)}' file
      $ sed '1s/^\(.\)\{,N\}//;$s/\(.\)^\{,M\}$//' file
      

      【讨论】:

        猜你喜欢
        • 2013-06-05
        • 2022-07-16
        • 2013-11-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-10
        • 1970-01-01
        • 2011-05-11
        • 2019-07-05
        相关资源
        最近更新 更多