2017-07-07 6 views
1

私はこのスクリプトの問題を解決するために無駄にしています。修正スクリプトBash

#!/bin/bash 
for a in `wget -O - "https://pastebin.com/raw/7BFC94Ty"`; do echo "local-zone: \""$a" redirect\"""local-data: \""$a" A 0.0.0.0\"" >> adstest.conf; done 

はここで結果

local-zone: "101com.com 
redirect"local-data: "101com.com 
A 0.0.0.0" 

である。しかし、これは右のフォーマットではありません、これは予想される結果である:

local-zone: "101com.com" redirect 
local-data: "101com.com A 0.0.0.0" 

しかし、私はこのいまいましい解決策を見つけることができません。また、私は40 000行のファイルを持っているので、私はそれのためのWebホストなしでやりたいと思っているので、URLではなくローカルファイルを使用できるソリューションを探しています。

ありがとうございました!

+0

cmd-lineか 'awk'の一部として' printf' cmdを使う方法を学んでください。 http://grymoire.com/Unix/awk.htmlを参照し、合理的な紹介についてはprintfを検索してください。 '[awk] printf'でここを検索すると、使い方を説明するのに役立つはずの6000+ Q/Aが見つかります。がんばろう。 – shellter

答えて

0

まず、あなたは、Windozeの改行を取り除くためにdos2unixを通してそれを実行する必要があり、2つの別々のecho Sを行うと、出力ファイルにループ全体の結果を送信:

for a in `wget -O - "https://pastebin.com/raw/7BFC94Ty" | dos2unix`; do 
    echo 'local-zone: "'$a'" redirect' 
    echo 'local-data: "'$a' A 0.0.0.0"' 
done >> adstest.conf 

Iも一重引用符を使用したので、印刷したいダブルスをエスケープする必要はありませんでした。

サンプル結果:

$ rm adstest.conf 

$ for a in `wget -O - "https://pastebin.com/raw/7BFC94Ty" | dos2unix`; do echo 'local-zone: "'$a'" redirect'; echo 'local-data: "'$a' A 0.0.0.0"'; done >> adstest.conf 
--2017-07-07 14:12:07-- https://pastebin.com/raw/7BFC94Ty 
Resolving pastebin.com (pastebin.com)... 104.20.208.21, 104.20.209.21 
Connecting to pastebin.com (pastebin.com)|104.20.208.21|:443... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: unspecified [text/plain] 
Saving to: ‘STDOUT’ 

-          [ <=>                 ] 385.23K --.-KB/s in 0.09s 

2017-07-07 14:12:07 (3.97 MB/s) - written to stdout [394475] 

$ wc -l adstest.conf 
41860 adstest.conf 

$ head adstest.conf 
local-zone: "101com.com" redirect 
local-data: "101com.com A 0.0.0.0" 
local-zone: "101order.com" redirect 
local-data: "101order.com A 0.0.0.0" 
local-zone: "123found.com" redirect 
local-data: "123found.com A 0.0.0.0" 
local-zone: "140proof.com" redirect 
local-data: "140proof.com A 0.0.0.0" 
local-zone: "180hits.de" redirect 
local-data: "180hits.de A 0.0.0.0" 
+0

for a in $(...)の使用を永続化しないでください。それは修正すべきバグです。 http://mywiki.wooledge.org/DontReadLinesWithFor – chepner

+0

私は彼のコードに可能な限り小さな変更を加えようと努力しました。 URLにはスペースは許されないので、この 'wget'の出力には空白を入れてはいけません。したがって、これは、彼が行を読むのではなく、言葉であるので、うまくいくでしょう。言葉はちょうど別々の行にある。 – Jack

+0

テストを実行しただけで問題があるようですが、出力ファイルは正常に作成されていますが空です。 – Barbosa

1

chepnerの懸念@対処するために、我々は、ストリームを処理するためにsedを使用することができます。

wget -O - "https://pastebin.com/raw/7BFC94Ty" | dos2unix | sed 's/\(.*\)/local-zone: "\1" redirect\nlocal-data: "\1 A 0.0.0.0"/' > adstest.conf 

それはちょうど\(.*\)で保存されたラインのパターン全体のスペースを取りそれを必要な場所の\1に置き換え、\nを使用して改行します。