2012-10-03 108 views
9

有沒有辦法,沒有雙迴路來完成下面的sed命令做什麼蟒蛇相當於sed的

輸入:

Time 
Banana 
spinach 
turkey 

sed -i "/Banana/ s/$/Toothpaste/" file

輸出:

Time 
BananaToothpaste 
spinach 
turkey 

我到目前爲止是一個雙重名單,這將需要很長的時間去通過兩者。

列表中有一串數字 B名單有相同的一串數字,但以不同的順序

對於A中的每個條目我想找到與相同數量的B的連線和增值服務C到它的結尾。

希望這是有道理的,即使我的例子沒有。

我是做猛砸以下和但它是工作它是超慢......

for line in $(cat DATSRCLN.txt.utf8); do 
     srch=$(echo $line | awk -F'^' '{print $1}'); 
     rep=$(echo $line | awk -F'^' '{print $2}'); 
     sed -i "/$(echo $srch)/ s/$/^$(echo $rep)/" tmp.1; 
done 

謝謝!

+3

你sed的例子並不等同於你實際上是試圖做。 –

+0

所以在bash中,我正在這樣做,它正在工作,但超級慢...... – user1601716

+0

你實際上可以使用'subprocess'命令在python中運行sed。 – karthikr

回答

9

使用re.sub()

newstring = re.sub('(Banana)', r'\1Toothpaste', oldstring) 

這捕獲一組(第一括號之間),並且以期望的後綴通過本身(\數部分),然後將其替換。需要使用r''(原始字符串),以便轉義正確解釋。

0

這是可以做到與系統要求低這一點使用tmp文件,只有一個迭代,而無需拷貝整個文件到內存:

#/usr/bin/python 
import tempfile 
import shutil 
import os 

newfile = tempfile.mkdtemp() 
oldfile = 'stack.txt' 

f = open(oldfile) 
n = open(newfile,'w') 

for i in f: 
     if i.find('Banana') == -1: 
       n.write(i) 
       continue 

     # Last row 
     if i.find('\n') == -1: 
       i += 'ToothPaste' 
     else: 
       i = i.rstrip('\n') 
       i += 'ToothPaste\n' 

     n.write(i) 

f.close() 
n.close() 

os.remove(oldfile) 
shutil.move(newfile,oldfile) 
2

如果您正在使用Python3下面的模塊將幫助您: https://github.com/mahmoudadel2/pysed

wget https://raw.githubusercontent.com/mahmoudadel2/pysed/master/pysed.py 

放置模塊文件到您的Python3模塊路徑,則:

import pysed 
pysed.replace(<Old string>, <Replacement String>, <Text File>) 
pysed.rmlinematch(<Unwanted string>, <Text File>) 
pysed.rmlinenumber(<Unwanted Line Number>, <Text File>) 
1

你實際上可以從python調用sed。許多方法可以做到這一點,但我喜歡使用sh模塊。 (yum -y install python-sh)

我的示例程序的輸出如下。

[[email protected] sh]$ cat input 
Time 
Banana 
spinich 
turkey 
[[email protected] sh]$ python test_sh.py 
[[email protected] sh]$ cat input 
Time 
Toothpaste 
spinich 
turkey 
[[email protected] sh]$ 

這裏是test_sh.py

import sh 

sh.sed('-i', 's/Banana/Toothpaste/', 'input') 

這可能只在Linux下工作。

3

後發到了比賽,這是我實施的sed在Python:在foo.txt的

sed('foo', 'bar', "foo.txt") 

將與 '酒吧' 替換所有 '富':

import re 
import shutil 
from tempfile import mkstemp 


def sed(pattern, replace, source, dest=None, count=0): 
    """Reads a source file and writes the destination file. 

    In each line, replaces pattern with replace. 

    Args: 
     pattern (str): pattern to match (can be re.pattern) 
     replace (str): replacement str 
     source (str): input filename 
     count (int): number of occurrences to replace 
     dest (str): destination filename, if not given, source will be over written.   
    """ 

    fin = open(source, 'r') 
    num_replaced = count 

    if dest: 
     fout = open(dest, 'w') 
    else: 
     fd, name = mkstemp() 
     fout = open(name, 'w') 

    for line in fin: 
     out = re.sub(pattern, replace, line) 
     fout.write(out) 

     if out != line: 
      num_replaced += 1 
     if count and num_replaced > count: 
      break 
    try: 
     fout.writelines(fin.readlines()) 
    except Exception as E: 
     raise E 

    fin.close() 
    fout.close() 

    if not dest: 
     shutil.move(name, source) 

例子

sed('foo', 'bar', "foo.txt", "foo.updated.txt") 

將取代在「foo.txt的」酒吧'所有「富」並保存結果「foo.updated.txt」。

sed('foo', 'bar', "foo.txt", count=1) 

只會取代「富」與「酒吧」的第一次出現,並將結果保存在原始文件「foo.txt的」