0

次のような複数の置換リストを使用して処理およびフォーマットする必要がある複数のテキスト ファイルを含むフォルダーがあります。

old string1~new string1
old string2~new string2
etc~blah

これらの複数のテキスト ファイルの各行で、置換リストから各置換ペアを実行します。これで、この操作を実行する一連の Python スクリプトができました。私が疑問に思っているのは、sed または awk に切り替えた場合、コードがよりシンプルになり、保守しやすくなるかということです。それはより良い解決策になりますか、それとも Python コードを改善する必要がありますか? 入力テキスト ファイルは定期的に送信され、多くの場合、以前とは構造が少し異なります。これらのファイルは人間によって作成されているため、間違い、スペルミス、複数のスペースなどです。そのため、コードと置換リストを常に調整して、適切に機能させる必要があります。ありがとう。

4

2 に答える 2

4

Python コードが非常に悪い場合を除き、awk に切り替えても保守性が向上することはまずありません。とは言っても、awk ではかなり単純ですが、うまくスケーリングできません。

cat replacement-list-files* | awk 'FILENAME == "-" { 
  split( $0, a, "~" ); repl[ a[1] ] = a[2]; next }
  { for( i in repl ) gsub( i, repl[i] ) }1' - input-file

これは一度に 1 つのファイルに対して機能することに注意してください。1複数のファイルを操作するようなものに置き換え{ print > ( FILENAME ".new" ) }ますが、多数のファイルを操作する場合は、ファイルを閉じる必要があり、すぐに管理不能な混乱になります。すでに有効なソリューションがある場合は、Python を使用してください。

于 2013-04-05T11:53:00.797 に答える
0

正規表現置換スクリプトは次のとおりです (ほとんどの場合、@WilliamPursell が投稿したものとは表面的に異なるだけです)。

   awk -F'~' '
   NR==FNR{ map[$1] = $2; next }
   {
      for (old in map) {
         gsub(old,map[old]
      }
   }
   ' /wherever/mappingFile file

しかし、本当に必要だと思う文字列置換スクリプトは次のとおりです。

   awk -F'~' '
   NR==FNR{ map[$1] = $2; next }
   {
      for (old in map) {
         rlength = length(old)
         while (rstart = index($0,old)) {
            $0 = substr($0,1,rstart-1) map[old] substr($0,rstart+rlength)
         }
      }
   }
   ' /wherever/mappingFile file

どちらの場合でも、複数のファイルに影響を与えるシェル ループで囲むだけです。

for file in *
do
   awk -F'~' '...' /wherever/mappingFile "$file" > tmp && mv tmp "$file"
done
于 2013-04-05T13:11:49.803 に答える