连接任意行以输出为一行

连接任意行以输出为一行

我想将文件的第三行和第五行加入到脚本的输出中,而不需要尾随新行。

是否可以使用以下代码来实现此构造:

{
 echo 'Some text'
 echo 'Some text'
 echo -n 'Some text'
 cat text
 cat text
 echo -n 'Some text'
 echo 'Some text'
} > file

我只需要在 cat 之后添加一些选项?

假设文件的第3行和第5行text分别是3和5。处理后必须采用以下形式:

 Some text 
 Some text
 Some text35Some text
 Some text

如果我理解正确的话,在我的例子中 sed 命令的实现是很糟糕的。

答案1

使用 sed

据我了解,您有一个text类似于以下内容的文件:

$ cat text
1
2
3
4
5

并且,您想要提取第 3 行和第 5 行并将它们放在一些语句的中间echo。在这种情况下,请尝试:

$ {  echo 'Some text';  echo 'Some text';  echo -n 'Some text';  echo -n "$(sed -n 3p text)$(sed -n 5p text)";  echo 'Some text';  echo 'Some text'; } >file
$ cat file
Some text
Some text
Some text35Some text
Some text

简化

上述操作可以通过一个echo命令完成:

$ echo $'Some text\nSome text\nSome text'"$(sed -n 3p text)$(sed -n 5p text)"$'Some text\nSome text' >file
$ cat file
Some text
Some text
Some text35Some text
Some text

或者,作为单个printf命令:

$ printf 'Some text\nSome text\nSome text%s%sSome text\nSome text\n' "$(sed -n 3p text)" "$(sed -n 5p text)" >file
$ cat file
Some text
Some text
Some text35Some text
Some text

sed 命令如何工作

上面使用 sed 命令,例如:

sed -n 3p text

这里-n有一个选项,告诉 sed 不要打印任何内容,除非我们明确要求它打印。 3p是告诉 sed 打印第三行的命令。类似地,我们使用5pif 来打印第五行。

使用 awk

一个 awk 解决方案(帽子提示:Runium):

awk '
    BEGIN{
        printf "%s","Some text\nSome text\nSome text"
    }
    NR>5 {exit}
    NR==3 || NR==5 {printf "%s", $0}
    END{
        printf "%s","Some text\nSome text\n"
    }' text

相关内容