【发布时间】:2021-06-25 06:05:15
【问题描述】:
假设我有一个仅包含一行的文件,其长度可能会有所不同。
This is an example row
我想要:
is an example
所以前 4 个字符和最后 3 个字符被修剪。
是否可以通过在 sh 中运行单个命令来实现?
【问题讨论】:
假设我有一个仅包含一行的文件,其长度可能会有所不同。
This is an example row
我想要:
is an example
所以前 4 个字符和最后 3 个字符被修剪。
是否可以通过在 sh 中运行单个命令来实现?
【问题讨论】:
使用普通的 POSIX sh,您可以执行以下操作:
myvar=$(sed -e 's/^....//' -e 's/...$//' input.txt)
使用更强大的 shell,如 bash 或 zsh,无需借助外部程序即可完成:
myvar=$(< input.txt)
myvar=${myvar:4:-3}
【讨论】:
ksh93 将使用${myvar:4:${#myvar}-7}
我假设“单个命令”是指一次执行(不排除管道)。
cat test.txt | cut -c5- | rev | cut -c4- | rev
细分:
【讨论】:
每行修剪前 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
【讨论】: