github | PYPI |问题| ChangElog
lineinfile受同一名称的Ansible模块的启发,如果尚不存在,则提供了一个命令和库,用于将行添加到文件中,并删除与文件中的模式匹配的线路。有一些选项可以使用正则拨号来查找以更新的线路或确定在之前或之后要插入哪个行的选项。有一些选项可以使用自定义文件扩展名来备份修改后的文件,并且可以将不存在的文件处理好,好像它只是空的。甚至还有一个选项可以根据匹配的正则捕获的捕获组来确定插入行。
与Ansible模块不同,此软件包不会执行任何文件属性管理。这些必须在外部设置。
安装
lineinfile需要Python 3.8或更高。只需将PIP用于Python 3(您有PIP,对吗?)即可安装lineinfile及其依赖关系:
python3 -m pip安装lineinfile
例子
一个粗制的.ini文件更新程序:将theoption设置为价值,如果在文件中找不到theoption的设置,请在“ [thesection randrand and thesection randrand and thesection randrand and)之后添加一个:
$ lineinfile add
--after-first "^[thesection]$"
-e "^theoptions*="
"theoption = thevalue"
settings.iniPython的同等操作:
from lineinfile import AfterFirst , add_line_to_file
add_line_to_file (
"settings.ini" ,
"theoption = thevalue" ,
regexp = r"^theoptions*=" ,
inserter = AfterFirst ( r"^[thesection]$" ),
)将“ foo = ...”的第一个实例替换为“ foo ='bar'”,保留缩进,并使用扩展名.bak创建文件备份,即使没有进行更改:
$ lineinfile add
-e "^(s*)foos*="
--backrefs
--match-first
--backup-always -i.bak
"1foo = 'bar'"
file.pyPython的同等操作:
from lineinfile import ALWAYS , add_line_to_file
add_line_to_file (
"file.py" ,
r"1foo = 'bar'" ,
regexp = r"^(s*)foos*=" ,
backrefs = True ,
match_first = True ,
backup = ALWAYS ,
backup_ext = ".bak" ,
)命令行的用法
lineinfile命令有两个子命令,添加和删除。
添加
lineinfile add [] [ ] lineinfile add [ ] -l [ ]
如果尚未存在,则将给定的行(将BackSlash Exapes扩展后)添加到文件中。如果使用-e/ - Regexp选项给出了Python正则表达式,并且它与文件中的任何行匹配,则行将替换最后一个匹配行(或第一个匹配行,如果给出 - 匹配 - 先到第一个)。如果正则表达式不匹配任何行(或未指定正则表达式),并且在文件中找不到行,则默认情况下将在文件末尾插入该行;这可以通过 - 第一个之后, - 持久之后,以前,较长和 - bof选项。
如果在命令行上没有给出文件名,则从标准输入中读取输入,结果将写入标准输出。当没有给出文件时,指定任何一个 - backup-backup-eLways,-backup-ext或 - 创建选项的错误是错误的。
选项
| -a正则-第一个正则延期 | |
| 如果在文件中都没有找到行和-regexp,请在与正则表达式符合正则表达式的第一行之后插入线,或者在文件末尾插入如果没有行匹配的话,则在文件末尾插入。 | |
| -a正则-持久的正则罚款 | |
| 如果在文件中都没有找到行和-regexp,请在与正则表达式符合正则表达式匹配的最后一行之后插入行,或者在文件末尾插入如果没有线匹配的话,则在文件末尾插入。 | |
| -b正则是第一个正则 | |
| 如果在文件中都没有找到线路和-regexp,请在与正则表达式符合正则表达式的第一行之前插入行,或者在文件末尾插入,如果没有行匹配的话,则在文件末尾插入。 | |
| -B正则是- 前后的正则 | |
| 如果在文件中都没有线和-regexp,请在与正则表达式符合正则表达式的最后一行之前插入行,或者在文件末尾插入,如果没有行匹配的话,则在文件末尾插入。 | |
| -bof | 如果在文件中都没有找到行和-regexp,请在文件开头插入行。 |
| - eof | 如果在文件中都没有找到行和-regexp,请在文件末尾插入行。这是默认值。 |
| -e Regex , -regexp Regex | |
| 如果给定的正则表达式与文件中的任何行匹配,请用行替换最后的匹配行(或第一个(如果是匹配至上))。 | |
| - backrefs | 如果-regexp匹配,则使用正则表达式中的捕获组来展开排队中的任何 n, g 如果-regexp不匹配,则输入不变。 在没有-regexp的情况下指定此选项是一个错误。 |
| - 回复, - 倒巴改变 | |
| 如果修改了输入文件,请创建原始文件的备份。备份将带有-backup-ext(或〜指定的扩展名)指定的扩展名附加到其文件名上。 | |
| - 始终 | |
| 无论是否修改,都可以创建原始文件的备份。备份将带有-backup-ext(或〜指定的扩展名)指定的扩展名附加到其文件名上。 | |
| -i ext , -backup-ext ext | |
| 创建一个输入文件的备份,并将EXT添加到文件名的末尾。含义 - 如果没有和 - 始终给出 - 背包变化。 | |
| -c , - 创建 | 如果输入文件不存在,请假装它是空而不是错误的,并使用操作结果创建它。无论其他选项如何,都不会为不存在的文件创建备份文件。 如果不存在输入文件,也没有进行更改(因为指定了-backrefs,并且-regexp不匹配),则不会创建该文件。 |
| -L线, -线路 | |
| 使用行作为插入的行。当线从连字符开始时,此选项很有用。 | |
| -m , - 匹配优先 | |
| 如果-regexp匹配,请用行替换第一个匹配行。 | |
| -m , - 匹配last | |
| 如果-regexp匹配,请用行替换最后的匹配行。这是默认值。 | |
| -o文件, - 输出文件文件 | |
将结果文件内容写入文件,而不是修改输入文件。 使用任何一个 - backup-langed, - backup-eLways或-backup-ext指定此选项是错误的。 | |
消除
lineinfile删除[] [ ] lineinfile删除[ ] -e [ ]
删除与给定Python正则表达式匹配的给定文件中的所有行。
如果在命令行上没有给出文件名,则从标准输入中读取输入,结果将写入标准输出。当不给出任何文件时,指定任何 - backup-backup-eLways或-backup-ext选项的错误是错误的。
选项
| - 回复, - 倒巴改变 | |
| 如果修改了输入文件,请创建原始文件的备份。备份将带有-backup-ext(或〜指定的扩展名)指定的扩展名附加到其文件名上。 | |
| - 始终 | |
| 无论是否修改,都可以创建原始文件的备份。备份将带有-backup-ext(或〜指定的扩展名)指定的扩展名附加到其文件名上。 | |
| -i ext , -backup-ext ext | |
| 创建一个输入文件的备份,并将EXT添加到文件名的末尾。含义 - 如果没有和 - 始终给出 - 背包变化。 | |
| -e Regex , -regexp Regex | |
| 删除与正则匹配的所有行。当Regex从连字符开始时,此选项很有用。 | |
| -o文件, - 输出文件文件 | |
将结果文件内容写入文件,而不是修改输入文件。 使用任何一个 - backup-langed, - backup-eLways或-backup-ext指定此选项是错误的。 | |
库API
请注意,所有正则表达式匹配都是使用tatter.search()方法完成的,即,它在行的开头没有锚定。为了强迫正则表达式以开始在线路的开头匹配,请以 ^或 a的前缀为前缀。
lineinfile . add_line_to_file (
filepath : Union [ str , bytes , os . PathLike [ str ], os . PathLike [ bytes ]],
line : str ,
regexp : Optional [ Union [ str , re . Pattern [ str ]]] = None ,
inserter : Optional [ Inserter ] = None ,
match_first : bool = False ,
backrefs : bool = False ,
backup : Optional [ BackupWhen ] = None ,
backup_ext : Optional [ str ] = None ,
create : bool = False ,
encoding : Optional [ str ] = None ,
errors : Optional [ str ] = None ,
) - > bool如果尚未存在,则将给定的行添加到文件中的文件中。如果修改文件,则返回true。如果将REGEXP设置为正则表达式(字符串或编译模式对象),并且与文件中的任何行匹配,则行将替换最后一个匹配的行(或第一个匹配行,如果match_first = true)。如果正则表达式不匹配任何行(或未指定正则表达式),并且在文件中找不到行,则默认情况下将在文件末尾插入该行;可以通过将适当的对象作为插入者参数传递来改变这一点。请参阅下面的“插入器”。
当BackRefs为True时,如果RegexP匹配,则使用正则表达式中的捕获组来扩展行中的任何 n, g
将备份设置为lineinfile 。改变时,如果修改了文件,则创建文件原始内容的备份。将备份设置为lineinfile .Lways时,无论文件是否修改,始终会创建备份。备份文件的名称将与原始文件相同,并附上backup_ext的值(默认值:〜)。
如果CREATE是真实的,并且不存在FilePath,请假装它是空而不是错误的,并通过操作结果创建它。对于不存在的文件,永远不会创建备份文件。如果不存在FilePath,也没有进行更改(因为设置了BackRefs,并且REGEXP与REGEXP不匹配),则不会创建文件。
lineinfile . remove_lines_from_file (
filepath : Union [ str , bytes , os . PathLike [ str ], os . PathLike [ bytes ]],
regexp : Union [ str , re . Pattern [ str ]],
backup : Optional [ BackupWhen ] = None ,
backup_ext : Optional [ str ] = None ,
encoding : Optional [ str ] = None ,
errors : Optional [ str ] = None ,
) - > bool删除符合正则表达式REGEXP(字符串或编译的模式对象)的文件中文件中的所有行。如果修改文件,则返回true。
将备份设置为lineinfile 。改变时,如果修改了文件,则创建文件原始内容的备份。将备份设置为lineinfile .Lways时,无论文件是否修改,始终会创建备份。备份文件的名称将与原始文件相同,并附上backup_ext的值(默认值:〜)。
lineinfile . add_line_to_string (
s : str ,
line : str ,
regexp : Optional [ Union [ str , re . Pattern [ str ]]] = None ,
inserter : Optional [ Inserter ] = None ,
match_first : bool = False ,
backrefs : bool = False ,
) - > str如果尚未存在并返回结果,则将给定的行添加到字符串s。如果将REGEXP设置为正则表达式(字符串或编译模式对象),并且与输入中的任何行匹配,则行将替换最后一个匹配行(或第一个匹配行,如果Match_first = true)。如果正则表达式不匹配任何线(或未指定正则表达式),并且在输入中找不到线,则默认情况下将在输入末端插入该行;可以通过将适当的对象作为插入者参数传递来改变这一点。请参阅下面的“插入器”。
当BackRefs为True时,如果RegexP匹配,则使用正则表达式中的捕获组来扩展行中的任何 n, g
lineinfile . remove_lines_from_string (
s : str ,
regexp : Union [ str , re . Pattern [ str ]],
) - > str从字符串s中删除匹配正则表达式REGEXP(字符串或编译模式对象)并返回结果的所有行。
插入者
插入器是add_line_*函数使用的对象,以确定在输入中找不到线路时插入线路的位置,如果设置了regexp参数,则不匹配任何行。
lineinfile提供以下插入器类:
- atbof()
- 总是在文件开头插入线
- ateof()
- 总是在文件末尾插入行
- 首先(regexp)
- 插入与给定的正则表达式匹配的第一个输入行之后的行(如果没有匹配,则匹配给定的正则表达式(字符串或编译模式对象),或者在文件末尾。
- 后光(Regexp)
- 插入与给定的正则表达式匹配的最后一个输入行之后的行(如果没有匹配,则匹配给定的正则表达式(字符串或编译模式对象),或者在文件末尾。
- 首先(regexp)
- 插入与给定的正则表达式(字符串或编译模式对象)匹配的第一个输入行之前的行,或者如果没有匹配,则在文件末尾。
- Beforelast(Regexp)
- 在与给定的正则表达式匹配的最后一个输入行之前插入线路(字符串或编译模式对象),或者如果没有匹配,则在文件末尾插入。
线路结尾的处理
lineinfile使用Python的Universal Newlines模式在文件上运行,其中所有LF( n),Cr LF( r n)和文件中的CR( r)序列在文件中仅将读取为python字符串,而LF则转换为lf,而LF转换为“ disk to disk”时,将LF转换为操作系统的本机线分隔器。
在大多数情况下,这使您可以在正则表达式中使用$,并且无论该线结束在磁盘上,它始终与输入线的末端匹配。但是,当使用add_line_to_string()或带有非LF线分离器的字符串的remove_lines_from_string()时,情况可能会变得棘手。 lineinfile遵循有关行分隔符的以下规则:
- 线仅由LF,CR和CR LF终止。
- 当add_line_*函数将行参数与输入中的行进行比较时,从两行中剥离了行结尾。这是与Ansible行为的偏差,其中只有输入线被剥离。
- 当将输入线与RegexP或插入器匹配时,线路结束不会剥离。请注意,像r“ foo $”这样的正则表达式将无法与非LF线结束结束的线路匹配,因此这可能会导致模式与您可能天真地期望它们匹配的位置与不匹配。
- 在文件末尾添加一条线时,如果文件未以线路结束结束,则在添加行之前会附加LF。
- 将行添加到文档(作为新行或替换预先存在的行)时,如果尚未以行分隔符结束,则将LF附加到该线路;将替换的任何线路上的任何线(如果有)被忽略(如果要保留它,请使用BackRefs)。如果结果线和替换线的唯一区别是线路结束,则仍会发生替换,则将线结束进行修改,并更改文档。
通过命令行克隆项目: