2017-03-09 54 views
1

我有一个文本文件(LIST.TXT)以下格式只替换值:Python或壳牌帮助:如何搜索一个词,旁边

Apple 1 
Banana 5.0 
orange_1 0.5 

列表可以去上很多线路。我想最终搜索单词“苹果”,只取代旁边的值。我知道如何使用可以搜索和替换单词的“sed”命令,但我不知道如何搜索单词并仅替换其旁边的值?

sed命令我在脚本中使用是S-如下:

sed "s/Apple/$1/g" list.txt > newlist.txt 

其中$ 1运行脚本定义,可以是任何东西(如葡萄)。再次,这将切换苹果一词,而不是它旁边的值。我希望能够通过使用SHELL或Python命令来执行此操作。任何帮助将是太棒了!

+1

'进口re'和'应用re.sub( '苹果12.34','苹果1')'。或者对“Apple”使用积极的回顾。 – ryugie

回答

0

假设每个符合键启动和值的其余部分在一行之后,可以使用以下sed命令来替换该值:

sed "s/\(^Apple \)\(.*$\)/\1$1/" 

请注意,这可能是一个脆弱/不安全的解决方案,具体取决于替换值,例如如果$1包含/,则它可以用于像/;d;s//这样的命令插入。

awk

更健壮的解决方案:

awk -v new="$1" '{print ($1 == "Apple") ? ($1 " " new) : $0}' 

UPD。两个命令都可以用直接的文件或通过标准流工作:

sed ... file.txt > new.txt 
cat file.txt | sed ... | cat > new.txt 

(不使用cat这样的,它在这里展示管道输入/输出)。此外,中sed有些版本会有选项-i更改文件到位: '[。\ d \]苹果+'

sed -i ... file.txt 
+0

我可以简单地在命令行输入这个吗?另外,你在哪里指定“list.txt”,以便可以在该文件上执行操作? – user7649922

+0

@ user7649922我已经更新了答案。 – Andrey

+0

sed和猫正在工作!谢谢!我无法让awk正常工作。我尝试过:awk -v new =“$ 1”'{print($ 1 == Apple“)?($ 1”“new):$ 0}'list.txt> newlist。txt其中$ 0可以被任何值替代 – user7649922

2

我在这里显示出积极的回溯方式@ryugie说:

content = '''Apple 1 
Banana 5.0 
orange_1 0.5''' 


def my_replace(content, fruit, value): 
    import re 
    return re.sub(r'(?<=' + fruit + ')([\d\.]+)', str(value), content) 


print my_replace(content, 'Apple', 4.0) 

print my_replace(content, 'Banana', 1.5) 

,我们可以得到:

Apple 4.0 
Banana 5.0 
orange_1 0.5 

Apple 1 
Banana 1.5 
orange_1 0.5 
+0

这并没有完全按照我的想法。文件“list.txt”包含Apple,Banana和Orange的信息。我注意到你必须使用“content =”这是另一种方法,但我需要更新文件“list.txt”。此外,输出数据看起来有点混乱香蕉。希望将文本文件(list.txt)更新或用新信息保存为“newlist.txt”。 – user7649922