次の文字列を含むテキストファイルがあり、それをCSVファイルに変換したいと思います。
次の文字列を分割したいと思います。
location = /example/url/newsite/redirect {return 301 https://example.com/fr;}
...次の値で:
/example/url/newsite/redirect,301,https://example.com/fr
現在、次のコマンドを使用しています
awk '{gsub(/;}/,"",$6); if ($1 == location) print $3","$6 }' redirections/*.redirections >> redirect-csv/redirect.csv
理想的にはファイル名を指定する必要はありません。 Redirections/ のすべての *.redirections ファイルをインポートし、1:1 マッピングを実行して Redirect-csv にファイルを生成する必要があります。
redirections/
site1.redirections
site2.redirections
Run the magic command.
redirect-csv/
site1.csv
site2.csv
答え1
この種の問題を解決する最善の方法は、正規表現を使用して文字列をパターンに一致させ、関連部分を抽出することです。
echo "location = /example/url/newsite/redirect {return 301 https://example.com/fr;}" |
sed -n 's/^location = \(.*\) {return \(3[[:digit:]]\{2\}\) \(.*\);}$/\1,\2,\3/p'
与えられた
/example/url/newsite/redirect,301,https://example.com/fr
または、フィールドにCSV形式の特殊文字(たとえば,
、、"
)を含めることができる場合:
perl -MText::CSV -lne '
BEGIN{$c = Text::CSV->new}
if (/^location = (.*) \{return (3\d\d) (.*);\}$/) {
$c->print(STDOUT, [$1, $2, $3])
}'
答え2
これを変更した後、最初のソリューションに基づいたソリューションがあります。
for file in redirections/*.redirection; do fname=$(basename $file); awk '{gsub(/;}/,"",$6); print $3" & "$5" & "$6 }' $file > redirect-csv/${fname/.redirection/.csv}; done
答え3
まあ、このラインが常に同じモデルに従うとしたら、別のラインがありますか?
echo "location = /example/url/newsite/redirect {return 301 https://example.com/fr;}" | awk '{gsub(/;}/,"",$6); print $3" & "$5" & "$6 }'
"myfile.csv"にリダイレクトしてください。
awk '{gsub(/;}/,"",$6); print $3" & "$5" & "$6 }' list.txt >> myfile.csv
list.txtにその行が含まれている場合
答え4
間違い - このコードはOP質問の略語です。
awk '...stuff...' r/*.red >> r-c/red.csv
...多くのファイルを入力して変更し、非常に長いファイルを出力します。 赤.csv文書。
>>
リダイレクト動作は非常に似ていますcat foo/* > bar/baz
。同じ略語を使用して単語の折り返しを防止し、with
basename
とxargsを使用し、cp
名前を変更するときにr/
ファイルをコピーするコマンドを生成しr-c/
、次を使用してその新しいファイルをその場で編集します。牛に似た一種の栄養sed
:basename -a -s r/*.red | xargs -L 1 -I {} cp r/{}.red r-c/{}.csv sed -i 's/^[^=]*= \|\;}$//g;s/ [^ ]* /,/;s/ /,/' r-c/*.csv