我编写了一个简单的 bash 脚本,用于打包文件然后上传,如果一切正常,我会得到一些http://
指向我的内容的链接作为输出,我想知道如何将这些链接自动复制到文件或变量?此外,我得到了一些不是以 开头的行,http://
而是以 开头的行,#
例如,我如何删除它们并在此处添加空行?
答案1
要捕获脚本输出到文件,请使用:
script.sh >file.txt
要删除注释(以 开头的行#
)但保留其位置的空白,请使用:
script.sh | sed 's/^#.*//' >file.txt
要执行上述所有操作同时在终端上显示信息,请使用:
script.sh | sed 's/^#.*//' | tee file.txt
解释
>
是 shell 的重定向符号。它告诉 shell 将要发送到 stdout 的内容重定向到指定的文件。sed
是一个逐行编辑实用程序。这里我们使用的sed
替换命令类似于 ,s/old/new/
其中old
是任何正则表达式。在我们的例子中,old
是,^#.*
其中^
匹配行首,#
匹配井号,.*
是通配符,用于匹配后面的任何内容。在我们的例子中,new
是空的。因此, 用空白行sed 's/^#.*//'
替换以 开头的行。#
tee
是一个用于复制 stdout 的实用程序。tee file.txt
它将获取在 stdin 上找到的任何内容并 (a) 将其保存到文件file.txt
,同时 (b) 将其发送到 stdout。如果要附加到它file.txt
而不是覆盖它,我们可以使用选项指示附加的tee -a file.txt
位置。-a
tee
改进
在本文件开头添加另一个 .txt 文件中的文本。txt
将 的内容放置first.txt
在 的开头file.txt
:
{ cat first.txt; script.sh; } >file.txt
仅复制以 http:// 开头的行
为了根据某些模式选择线条而不进行修改,grep
正确的工具是:
script.sh | grep '^http' >file.txt
使用 http://* 从第一行复制
sed
允许选择一系列行。这里,我们使用范围/^http/,$
,其中/^http/
是遇到的第一行,以 开头http
,$
是 sed 中表示输入中最后一行的符号。 p
指示sed
打印与该范围匹配的行:
script.sh | sed -n '/^http/,$ p'
结合从另一个文件添加文本并从第一行复制 http://*
{ cat first.txt; script.sh; } | sed -n '/^http/,$ p' >file.txt
在以以下开头的每一行后添加一个空白行http
这里我们再次使用sed
。当我们找到以 开头的行时,我们会在该行末尾http
添加一个换行符:\n
script.sh | sed 's/^http.*/&\n/'