在包含文件名列表的文件中将“_”替换为“,”

在包含文件名列表的文件中将“_”替换为“,”


如果有人可以帮助编写一个 shell 脚本来满足以下要求,这对我会有帮助。

我有一个文本文件,其中包含文件名列表,如下所示:

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
..
..

现在我想将文本文件中列出的所有文件名的第一个和第二个“_”替换为“,”。这样文件名就变成:

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='')

关键思想是我们逐行读取文件,在分隔符处将其分解为多个部分,并使用切片符号_将前 3 项连接到一个字符串中。如果需要将该输出保存为文件,请使用shell 运算符并将输出发送到文件。_[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

相关内容