Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python或Shell帮助:如何搜索单词并仅替换其旁边的值_Python_Shell - Fatal编程技术网

Python或Shell帮助:如何搜索单词并仅替换其旁边的值

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,而

我有一个文本文件(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,而不是它旁边的值。我希望能够使用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@user7649922
awk
脚本中的
$1
(第一个字段)和
$0
(整行)与
$1
(第一个参数)不同在shell脚本中。有关详细信息,请参见
manawk
。还请仔细检查注释中的引号:
Apple“
应该是
“Apple”
sed ... file.txt > new.txt
cat file.txt | sed ... | cat > new.txt
sed -i ... file.txt