在bash中逐行编辑文本文件

时间:2019-08-27 00:08:35

标签: string bash replace

我有一个requirements.txt文件,其中包含以下几行-

PyMySQL==0.9.3
botocore==1.12.196
boto3==1.9.188

我需要使用bash就地编辑此文件,以删除包含boto3botocore的所有行。到目前为止,我已经提出了-

while read a ; do echo ${a//boto3==1.9.188/} ; done < requirements.txt > requirements.txt.t ; mv requirements.txt{.t,}

..成功删除了包含boto3==1.9.188的行。但是,此版本号可以是任何数字,例如1.10.122

如何概括上面的脚本以删除包含boto3botocore字符串的所有行?还是有更好的方法来做到这一点?谢谢。

4 个答案:

答案 0 :(得分:2)

grep -vE '^(botocore|boto3)\W' requirements.txt > requirements.txt.new && \
    mv requirements.txt.new requirements.txt

说明:

  • -v告诉grep匹配匹配模式的输出行,并跳过匹配匹配的行。
  • -E告诉grep允许使用扩展的正则表达式,我们将其用于替换。
  • ^将样式锚定到行的开头,以使其与foobotocore==1.2.3不匹配。
  • (x|y)构造与xy匹配。 (要添加第三个包,只需添加另一个|即可创建(x|y|z)。)
  • 模式中的
  • \W匹配“非单词字符”,因此模式不匹配botocorefoo==1.2.3
  • &&仅在mv成功并且至少匹配一行(防止破坏整个文件)时才调用grep命令。

答案 1 :(得分:2)

使用awk

awk '!/(botocore|boto3)/' requirements.txt > requirements.txt.t && mv requirements.txt.t requirements.txt

答案 2 :(得分:1)

使用ed

printf 'g/botocore/d\ng/boto3/d\nwq\n' | ed requirements.txt

ed的工作方式是从标准输入中读取一组命令(由换行符终止),并将它们应用于以其参数命名的文件。如果您熟悉sed,这些命令应该看起来很熟悉(实际上,sed是基于ed s tream ed 监视器)。

  • g/botocore/d选择与正则表达式botocore匹配的每一行,并将d(删除)命令应用于每行。
  • g/boto3/d对于与boto3匹配的行执行相同的操作。
  • wq保存更改和报价。

答案 3 :(得分:0)

使用perl:

在这种情况下,我喜欢perl,因为

  1. 您无需担心文件操作
  2. 您也可以轻松地备份文件。

命令:

$ perl -ni -e '/\b(boto3|botocore)\b/ || print;' requirements.txt

选项分解

  • -n遍历文件中的行
  • -i在适当位置编辑文件。
  • -i.orig在适当位置编辑文件并使用扩展名'.orig'进行备份
  • -e执行perl命令

/ \ b(boto3 | botocore)\ b / ||打印;

如果行与boto3或botocore的单词不匹配,则进行读取,然后打印。 \ b表示单词边界。

示例:

$ cat requirements.txt
PyMySQL==0.9.3
botocore==1.12.196
boto3==1.9.188
$ perl -ni -e '/\b(boto3|botocore)\b/ || print;' requirements.txt
$ cat requirements.txt
PyMySQL==0.9.3
$

示例备份名为“ requirements.txt.orig”的文件

$ cat requirements.txt
PyMySQL==0.9.3
botocore==1.12.196
boto3==1.9.188
$ perl -ni.orig -e '/\b(boto3|botocore)\b/ || print;' requirements.txt
$ cat requirements.txt
PyMySQL==0.9.3
$ cat requirements.txt.orig
PyMySQL==0.9.3
botocore==1.12.196
boto3==1.9.188