我不知道什么可以做到这一点,sed、vim 还是其他什么。假设我有 30 个函数,为了简单起见,我将展示 3 个
#first function
AddOne = [
a+1==b, b+1==c
]
# second function
AddTwo = [
a+1==b, b+1==c
]
# third function
MultiplyByTwo = [
a+1==b, b+1==c, c+1==d
]
#Fourth Function
MultiplyByThree [
a+1==b, b+1==c, c+1==d
]
这个小例子表明我已经按照我想要的方式创建了我的函数,它们与第一个函数类似,所以我复制粘贴,并更改了它们的名称和一些参数。我想要做的就是在函数中用 2 替换 1,AddTwo
在第三个函数中用幂替换加号,用 2 替换 1,在第三个函数中也用 3 替换 1。
基本上,我有一个大文件,里面全是函数,我想动态地编辑这些函数,让它们按照我的要求去做
它不必是完全自动化的解决方案。我正在寻找的是一些文本编辑器的插件,它允许我选择一个文本并在该特定功能上使用搜索和替换工具,所有编辑器都有搜索和替换工具,但它们会搜索整个文件,我想搜索使用鼠标选择的代码部分
答案1
vim 中有两种可能性:
在可视化选择中搜索和替换:选择一个视觉选择(
v
从正常模式),然后使用::'<,'>s/1/3/g
您会注意到,如果您在可视模式下按下“:”,它将
:'<,'>
自动出现,因此您只需输入搜索和替换命令;(我喜欢的)在 vim 中编辑,在正常模式下,当在一个数字上时,CTRL-A 将增加它,CTRL-X 将减少它 --- 这是 vim 中最有用的快捷方式之一...
答案2
不确定这是否就是您要找的。
在带有的脚本下面,您可以通过函数的索引(0 = 第一个函数)更改其名称、数字和运算符。
在脚本的头部,你可以设置一个包含所需设置的元组列表,例如:
[(index, ("NewName"), ("digit"), ("operator")), (index, ("NewName"), ("digit"), ("operator"))]
您可以选择任何想要更改的索引。如果一个或多个属性不需要更改,请将元组留空。
例如:只改变索引为 2 的函数的名称(第三个函数,因为 0 = 第一个):
[(2, ("NewName"), (), ())]
要更改前两个函数:
changes = [(0, ("FuncName1"), ("2"), ("+")), (1, ("FuncName2"), ("2"), ("**"))]
保留不同的功能集
该脚本主要用于通过保留不同的changes =
行并注释掉除当前需要的行之外的所有内容来保留不同的函数属性集的情况。
如何使用
将下面的脚本复制到一个空文件中,设置需要改变的函数的参数、文件的路径,保存为script.py并通过以下方式运行:
python3 /path/to/script.py
剧本:
#!/usr/bin/env python3
# function / name / digit / operator
# (example)
changes = [(0, ("Name1"), (), ()), (1, ("Name2"), ("2"), ("**"))]
subject_file = "/path/to/file_withfunctions"
operators = ["+", "-", "*"] # ** has been taken care of in the script, you can use it in the "changes" line
with open(subject_file) as sample:
lines = [line for line in sample.readlines()]
def first_occurrence(index, string, lines):
area = lines[index:]
func_line = [[i, area[i]] for i in range(len(area))if string in area[i]][0]
func_line[0] = func_line[0]+index
return func_line
functiondata = [[[i, lines[i]],first_occurrence(i, "==", lines)] for i in range(len(lines)) if "[" in lines[i]]
for item in changes:
subject = functiondata[item[0]]
if len(item[1]) != 0: # name
name = subject[0][1].split()[0]
newname = item[1]
lines[subject[0][0]] = lines[subject[0][0]].replace(name, newname)
if len(item[2]) != 0: # digit
or_line = subject[1][1]
character = [ch for ch in or_line if ch.isdigit()][0]
new_line = or_line.replace(character, item[2])
lines[subject[1][0]] = new_line
if len(item[3]) != 0: # operator
or_line = new_line
if "**" in or_line:
new_line = or_line.replace("**", item[3])
else:
character = [ch for ch in operators if ch in or_line][0]
lines[subject[1][0]] = new_line
new_line = or_line.replace(character, item[3])
lines[subject[1][0]] = new_line
with open(subject_file, "wt") as sample:
for line in lines:
sample.write(line)
答案3
Emacs 有一个你可能会觉得有用的功能。它被称为键盘宏计数器。
例如,如果在定义宏时输入以下序列,
C-x C-k C-i C-x C-k C-i C-u C-x C-k C-i C-x C-k C-i
则文本“0112”将插入缓冲区,并且在宏的第一次和第二次执行时插入“3445”和“6778”。
阅读更多EmacsWiki 页面关于键盘宏计数器。
如果你从未使用过 emacs 键盘宏来执行交互式搜索/替换工作,你还需要阅读主要内容关于键盘宏的页面。