Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 脚本:仅复制两个指定行之间的零件_Bash_Vim_Awk - Fatal编程技术网

Bash 脚本:仅复制两个指定行之间的零件

Bash 脚本:仅复制两个指定行之间的零件,bash,vim,awk,Bash,Vim,Awk,例如 文件A.txt具有以下上下文 aaa bbb ccc ddd eee 有什么脚本可以实现这个目标,比如 script.sh a.txt 2 4 输出: bbb ccc ddd 其中2和4是指定的行号。您可以使用awk: awk 'NR>=2 && NR<=4' file 更一般地说: awk -v beginning=$first -v end=$last 'NR==beginning, NR==end' $file 最简洁的方法是使用sed: sed

例如

文件A.txt具有以下上下文

aaa
bbb
ccc
ddd
eee 
有什么脚本可以实现这个目标,比如

script.sh a.txt 2 4

输出:

bbb
ccc
ddd
其中2和4是指定的行号。

您可以使用awk:

awk 'NR>=2 && NR<=4' file
更一般地说:

awk -v beginning=$first -v end=$last 'NR==beginning, NR==end' $file

最简洁的方法是使用sed:

sed是一个基本工具,可以很好地处理此问题:

sed -n '2,4p' file          # method 1
sed '2,4!d' file            # method 2

看,;sed一行程序的一个很好的资源。

最好的选择是使用awk或前面提到的sed。 如果您只喜欢使用传统的UTIL,则可以在$FILE是a.txt的情况下使用以下技巧:

#!/bin/env bash
FILE=a.txt
SIZE=`wc -l $FILE`
let STARTPOS=$SIZE-$1
let OFFSET=$2-$1
cat $FILE | tail -n $STARTPOS | head -n $OFFSET

什么,你能把它和awk标签联系起来,但却不知道如何用它来完成这个简单的任务?!我想说awk和sed是传统的UTIL。awk和sed已经存在了30多年,你很难得到比这更传统的东西。你的方法太复杂了。哇!awk的强大功能让我惊叹不已。谢谢@doubleDown的评论!
$ sed '2,4!d' file
bbb
ccc
ddd
sed -n '2,4p' file          # method 1
sed '2,4!d' file            # method 2
#!/bin/env bash
FILE=a.txt
SIZE=`wc -l $FILE`
let STARTPOS=$SIZE-$1
let OFFSET=$2-$1
cat $FILE | tail -n $STARTPOS | head -n $OFFSET