如果有人可以帮助编写一个 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