【发布时间】:2016-07-27 14:18:50
【问题描述】:
我有一个纯文本文件“用户数据库”,其中包含一遍又一遍重复的相同 4 行。每 4 行“数组”代表用户数据库中的一个用户,如下所示:
'AX112233':
uid => '22044',
groups => ['grp01'],
password => 'passwordXYZ',
comment => 'Mickey Mouse';
AX112233 始终是唯一值。我需要一个脚本,当给定 2 个值时,即唯一用户名 AX112233 和新密码 AX112233:passwordABC,将能够在文件中找到唯一用户名并替换引号之间的密码值 3 行。
所以在接收到AX112233:passwordABC作为输入后,数组会改变如下:
'AX112233':
uid => '22044',
groups => ['grp01'],
password => 'passwordABC',
comment => 'Mickey Mouse';
最好是用bash/sed/awk/ 写的东西,但不一定是这样。任何帮助将不胜感激。
到目前为止,我所拥有的是这个 Perl 脚本。我确信这对于 Perl 专家来说是一件容易的事,而我不是。脚本的问题是初始密码未知,因此脚本需要替换 password => 之后单引号之间的任何内容
$ cat input.txt
AX112233':
password => 'passwordXYZ',
uid => '22044',
groups => ['grp01'],
comment => 'Mickey Mouse';
$ perl -pe '++$x and next if /AX112233/; $x-- and s/passwordXYZ/passwordABC/ if $x' input.txt
AX112233':
password => 'passwordABC',
uid => '22044',
groups => ['grp01'],
comment => 'Mickey Mouse';
上面的另一个问题是行密码必须是AX11223下面的下一行。如果该行低于 3 行,例如
AX112233':
uid => '22044',
groups => ['grp01'],
password => 'passwordABC',
comment => 'Mickey Mouse';
【问题讨论】:
-
SO 不是免费的编码服务,我们在这里帮助您修复代码。但您必须先尝试,并展示您的尝试,以便我们帮助您了解哪里出了问题。
-
这应该很简单,使用
awk。 -
抱歉,我应该提到我一直在做的事情,认为这对程序员来说很容易。
-
给一个人一条鱼,他可以吃一天;教他钓鱼,他吃一辈子。我在教你钓鱼,这意味着你必须自己尝试。
-
此外,显示您目前拥有的代码可以大大缩小我们需要解释的部分。很多时候,问题中的诊断结果需要一个解释基本引用或运算符优先级的答案,而不是 OP 认为的问题。
标签: linux bash perl sed substitution