我尝试在一行中使用 XARGS 或 FOR 来接受以下列表网址作为参数,这会失败,因为文件名不能是 URL。我们尝试使用 FOR 和 XARGS 执行此操作,但失败了:
$for i in $(cat example.txt);do echo $i > $i; done
bash: http://example.site.com: No such file or directory
bash: https://secureexample.com: No such file or directory
$cat example.txt | xargs -I {} sh -c "echo {} > {}"
sh: 1: cannot create http://example.site.com: Directory nonexistent
sh: 1: cannot create https://secureexample.com: Directory nonexistent
是否可以从第二次出现的参数(输出文件的名称)中删除正斜杠,以便每个主机获得一个不同的文件,例如:
http.example.site.com
https.secureexample.com
我对单行 bash 的了解非常有限,遗憾的是,这是公司的偏好。我尝试在文件名上使用花括号,并使用 SED、AWK 甚至 CUT 更改值,但正如我所说,我的知识太有限了。我还尝试使用 XARGS 和 FOR 的多个参数,但我也失败了。
我可以通过使用以下方法创建单独的文件来解决这个问题URI代替网址,然后补充 http:// 和 https://,但这意味着文件数量加倍,命令数量加倍,例如:
$cat http_example.txt
example.site.com
secureexample.com
$cat http_example.txt | xargs -I {} sh -c "echo http://{} > {}"
$ls -la
-rw-r--r-- 1 root root 24 Mar 22 08:06 example.site.com
-rw-r--r-- 1 root root 25 Mar 22 08:06 secureexample.com
有没有任何如何在使用带有 URL 的文件时通过单行 bash 命令完成此操作?谢谢!
答案1
while read -r i;do echo "$i">"${i#http*://}";done<example.txt
这将删除前导http(s)://
部分,并创建example.site.com
和secureexample.com
文件。
是一个从前导部分${i#http*://}
中删除匹配项的构造(是一个通配符)。$i
http*://
*
while read -r i;do echo "$i">"$(echo "$i"|sed 's|://|.|')";done<example.txt
这将创建文件http.example.site.com
和https.secureexample.com
。
用sed
替换://
输入文件的行.
。