![コマンドおよび出力ファイル名の引数として URL を使用する](https://rvso.com/image/1618727/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8A%E3%82%88%E3%81%B3%E5%87%BA%E5%8A%9B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%AE%E5%BC%95%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%20URL%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B.png)
私はXARGSまたはFORを1行で使用して、リストを受け入れようとしています。URL引数として、ファイル名は 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
2 回目の引数 (出力ファイル名) からスラッシュを削除して、ホストごとに異なるファイルを取得することは可能ですか? たとえば、次のようになります。
http.example.site.com
https.secureexample.com
残念ながら、シングル ライン bash に関する私の知識はかなり限られています。それが会社の好みなのです。ファイル名に中括弧を使用して、SED、AWK、さらには CUT で値を変更してみましたが、前述したように私の知識は限られています。また、XARGS と FOR で複数の引数を試してみましたが、これも見事に失敗しました。
私は別のファイルを作成することでこの問題を回避することができました。URIの代わりにURL、そして http:// と https:// を追加しますが、これはファイルとコマンドが 2 倍になることを意味します。例:
$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 を含むファイルを使用しながら、これを 1 行の 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
置き換えます。://
.