Python或Shell帮助:如何搜索单词并仅替换其旁边的值
我有一个文本文件(list.txt),格式如下:Python或Shell帮助:如何搜索单词并仅替换其旁边的值,python,shell,Python,Shell,我有一个文本文件(list.txt),格式如下: Apple 1 Banana 5.0 orange_1 0.5 这个列表可以有很多行。我想最终搜索“苹果”一词,只替换它旁边的值。我知道如何使用“sed”命令来搜索和替换一个单词,但我不知道如何搜索一个单词并只替换它旁边的值 我在脚本中使用的sed命令如下所示: sed "s/Apple/$1/g" list.txt > newlist.txt 其中$1在运行脚本中定义,可以是任何内容(例如grape)。这将再次切换单词Apple,而
Apple 1
Banana 5.0
orange_1 0.5
这个列表可以有很多行。我想最终搜索“苹果”一词,只替换它旁边的值。我知道如何使用“sed”命令来搜索和替换一个单词,但我不知道如何搜索一个单词并只替换它旁边的值
我在脚本中使用的sed命令如下所示:
sed "s/Apple/$1/g" list.txt > newlist.txt
其中$1在运行脚本中定义,可以是任何内容(例如grape)。这将再次切换单词Apple,而不是它旁边的值。我希望能够使用SHELL或Python命令执行此操作。任何帮助都会很棒 这里我展示了@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)
假设每行都以键开头,且值是空格后的行的其余部分,则可以使用以下
sed
命令仅替换值:
sed "s/\(^Apple \)\(.*$\)/\1$1/"
请注意,这可能是一个脆弱/不安全的解决方案,具体取决于替换值,例如,如果$1
包含/
,它可以用于命令插入,如/;Ds//
使用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
,可以就地更改文件:
import re
和re.sub('Apple[\d\.]+'、'Apple 12.34'、'Apple 1')
。或者对'Apple'
进行正面回溯。这并没有像我想的那样奏效。文件“list.txt”包含苹果、香蕉和橙色的信息。我注意到您必须使用“content=”这是另一种方法,但我需要更新文件“list.txt”。此外,香蕉的输出数据看起来有点混乱。希望更新文本文件(list.txt)或将其保存为带有新信息的“newlist.txt”。我可以在命令行上简单地键入吗?另外,您在哪里指定“list.txt”以便可以对该文件执行操作?sed和cat正在工作!!!非常感谢。我无法让awk正常工作。我尝试过:awk-v new=“$1”{print($1==Apple”)?($1”new):$0}'list.txt>newlist.txt,其中$0可以被任何value@user7649922awk
脚本中的$1
(第一个字段)和$0
(整行)与$1
(第一个参数)不同在shell脚本中。有关详细信息,请参见manawk
。还请仔细检查注释中的引号:Apple“
应该是“Apple”
。
sed ... file.txt > new.txt
cat file.txt | sed ... | cat > new.txt
sed -i ... file.txt