我有一些格式的文件
Y15-SUB-B04-P17-BK_M02734_4_000000000-ANNUF_1_1111_24724_4878;size=1;
Y15-SUB-B05-P22-LM_M02734_4_000000000-ANNUF_1_1111_20624_14973;size=1;
Y15-SUB-B05-P22-LM_M02734_4_000000000-ANNUF_1_1103_11326_10379;size=1;
Run Code Online (Sandbox Code Playgroud)
我希望用冒号 (:) 替换每个出现的下划线 (_),除了第一个。我想要这样的输出:
Y15-SUB-B04-P17-BK_M02734:4:000000000-ANNUF:1:1111:24724:4878;size=1;
Y15-SUB-B05-P22-LM_M02734:4:000000000-ANNUF:1:1111:20624:14973;size=1;
Y15-SUB-B05-P22-LM_M02734:4:000000000-ANNUF:1:1103:11326:10379;size=1;
Run Code Online (Sandbox Code Playgroud)
我知道我可以sed -i '' 's/_/:/g' old_file用来替换 ALL(或sed 's/_/:/g' old_file > new_file),并且我可以添加数字来仅替换第 2 次、第 4 次左右的出现:
sed 's/_/:/2' old_file > new_file
Run Code Online (Sandbox Code Playgroud)
但是如何替换每行上的每个出现但第一次出现?
我需要在 MacOSX 10.10 上替换(大)文件中的字符串。我的文件看起来像这样:
Y16-TUL-SUB_ Y16-TUL-SUB_ Y16-TUL-SUB_ Y16-TUL-SUB_ Y16-TUL-SUB-
Y16-TUL-SUB_ Y16-TUL-SUB_
Run Code Online (Sandbox Code Playgroud)
我需要替换Y16_TUL_SUB_为Y16-TUL-SUB-. 文件名可以是test.txt.
我已经尝试了很多不同的建议sed,awk和python。例如这个:
#!/usr/bin/env python import sys import os import tempfile
tmp=tempfile.mkstemp()
with open(sys.argv[1]) as fd1, open(tmp[1],'w') as fd2:
for line in fd1:
line = line.replace('Y16_TUL_SUB_','Y16-TUL-SUB-')
fd2.write(line)
os.rename(tmp[1],sys.argv[1])
Run Code Online (Sandbox Code Playgroud)
或者sed据说是 mac
或find:
find . -type f -name test.txt | xargs sed -i ""
"s/Y16_TUL_SUB_/Y16-TUL-SUB-/g'
Run Code Online (Sandbox Code Playgroud)
或sed:
sed -i -e "s/Y16_TUL_SUB_/Y16-TUL-SUB/g" test.txt
Run Code Online (Sandbox Code Playgroud)
或者 awk …