2016-11-12 34 views
0

変更する必要があるテキストファイルが10,000あります。複数のファイルの最初の行の文字列を置き換えます。

すべてのファイルの最初の行にはURLが含まれています。いくつかのファイルのためのミスにより

は、超音速(それが

eg: 
    1) http://www.supersonic.com/psychology 
    2) http://www.supersonic.com/social 
    3) http://www.supersonic.com/science 

を欠落している場合、すべてのURLが同じドメインである私の仕事は、チェックして追加することです「COM」

eg: 
1) http://www.supersonic./psychology 
2) http://www.supersonic./social 
3) http://www.supersonic.com/science 

「COM」をmissking URL .com)

あなたは私にすばやく簡単なアプローチを提案できますか?

はこれをしようとしました: supersonic.com

sed -e '1s/supersonic.//supersonic.com/' * 

出力に変化はないとsupersonic./を交換します。

答えて

1

コードに非常に近いですが、. charの後に末尾の/ charを考慮する必要があります。あなたはs/srchpat\/withSlash/replaceStr/'の内側/をエスケープする必要があるのではなく、あなたが後に別の文字を使用することができます

sed -i '[email protected]\./@supersonic.com/@' * 

注を行うことができます-i(インプレース編集)オプション付きのモダンなsedを使用していると仮定すると、

区切り文字としてsコマンドを入力します。ここでは[email protected]@[email protected]を使用します。検索パターンに@の文字がある場合は、別の文字を使用する必要があります。 sed

一部の古いバージョンでは、最初の使用時にこれらのケースについてそう

 sed 's\@[email protected]@' file 

を別の区切り文字をエスケープするためにあなたに必要があります。

-iオプションをサポートしていないsedを使用している場合は、 ファイルをループして、tmpファイルを管理する必要があります。

for f in *.html ; do 
    sed '[email protected]\./@supersonic.com/@' "$f" > /tmp/"$f".fix \ 
    && /bin/mv /tmp/"$f".fix "$f" 
done 

警告しかし、あなたは約10,000 +ファイルを話しているように、あなたはこれらのソリューションのいずれかを使用する前に、いくつかのテストをしたいでしょう。これらのファイルの無作為なセットを/ tmp/mySedTest/dirにコピーし、そこにこれらのソリューションの1つを実行して、驚きがないことを確認します。

そして、10,000行以上のファイルでcmd-line MAX_SIZEを吹き飛ばす可能性が高いので、findとxargsについて読んでください。 [sed] find xargsについての投稿が多数あります。必要に応じてそれらをチェックしてください。

IHTH

2
  1. -iを使用すると、変更された行を出力するのではなく、ファイルを変更できます。

  2. あなたが正規表現で/を使用する(または正規表現で\/を使用)したい場合は/とは異なる区切り文字を使用してください。

  3. \.を使用すると、ドットと文字通り一致します。.は何でも一致します。

    sed -i~ -e '1s=supersonic\./=supersonic.com/=' * 
    

sedの一部のバージョンは-iをサポートしていません。

関連する問題