複数の区切り文字を使用した文字列の分割

複数の区切り文字を使用した文字列の分割

次の文字列を含むテキストファイルがあり、それを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

  1. 間違い - このコードはOP質問の略語です。

    awk '...stuff...' r/*.red >> r-c/red.csv
    

    ...多くのファイルを入力して変更し、非常に長いファイルを出力します。 赤.csv文書。 >>リダイレクト動作は非常に似ていますcat foo/* > bar/baz

  2. 同じ略語を使用して単語の折り返しを防止し、withbasename と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
    

関連情報