ファイル名のリストを含むファイルの「_」を「、」に置き換えます。

ファイル名のリストを含むファイルの「_」を「、」に置き換えます。


誰かが次の要件を満たすシェルスクリプトを書くのに役立つことができれば役に立ちます。

次のファイル名のリストを含むテキストファイルがあります。

ADB_AR_2006_07.pdf
ADBL_AR_2010_11.pdf
CBL_AR_2013_14.pdf
CZBIL_AR_2007_08.pdf
BOKL_AR_2015_16.pdf
..
..

ここで、テキストファイルにリストされているすべてのファイル名の最初と2番目の「_」を「、」に置き換えたいと思います。その後、ファイル名は次のようになります。

ADB,AR,2006_07.pdf
ADBL,AR,2010_11.pdf
CBL,AR,2013_14.pdf
CZBIL,AR,2007_08.pdf
BOKL,AR,2015_16.pdf
..
..

答え1

簡単に使えますsed表現する:

sed -Ei 's/^([^_]+)_([^_]+)_/\1,\2,/' file

file修正内容:

ADB,AR,2006_07.pdf
ADBL,AR,2010_11.pdf
CBL,AR,2013_14.pdf
CZBIL,AR,2007_08.pdf
BOKL,AR,2015_16.pdf

  • i- 内部ファイルの変更を許可

  • -E- 拡張正規表現を許可


単純化されたアプローチは次のとおりです。

sed -i 's/_/,/; s/_/,/' file

答え2

単純なPythonスクリプト

#!/usr/bin/env python
from __future__ import print_function
import sys
with open(sys.argv[1]) as f:
    for line in f:
        tokens=line.strip().split('_')
        print(",".join(tokens[0:3]),'_',tokens[3],sep='')

重要なアイデアは、ファイルを1行ずつ読み、区切り文字で複数の部分に分割し、_スライス表記を使用して最初の3つの項目を文字列に連結することです。この出力をファイルに保存する必要がある場合は、シェル演算子を使用して出力をファイルに送信します。_[0:3]>

テスト:

$ ./edit_lines.py input.txt                                                                                                                                                             
ADB,AR,2006_07.pdf
ADBL,AR,2010_11.pdf
CBL,AR,2013_14.pdf
CZBIL,AR,2007_08.pdf
BOKL,AR,2015_16.pdf

答え3

解決策awk

$ awk -F"_" '{ print $1","$2","$3"_"$4}' list 
ADB,AR,2006_07.pdf
ADBL,AR,2010_11.pdf
CBL,AR,2013_14.pdf
CZBIL,AR,2007_08.pdf
BOKL,AR,2015_16.pdf

関連情報