【问题标题】:Search for word in file then replace text in other file在文件中搜索单词,然后替换其他文件中的文本
【发布时间】:2021-10-17 05:58:02
【问题描述】:

我有两个文件。 File1 包含这样的用户名和密码:

[reader]
label                         = anylabel
protocol                      = cccam
device                        = some.url,13377
user                          = Username1
password                      = password1
password2                     = password2
inactivitytimeout             = 30
group                         = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
cccversion                    = 2.3.2
ccckeepalive                  = 1

File2 包含如下一行:

http://link:port/username/password/12345

现在我有了这个“代码”来更改 File2 中的用户名/密码:

UsernameOLD=Username1
PasswordOLD=password1
UsernameNEW=Username2
PasswordNEW=password2

sed -i -e "s/\/$UsernameOLD\/$PasswordOLD/\/$UsernameNEW\/$PasswordNEW/" /etc/enigma2/file2.cfg

现在我有不同的用户名,它们在 File1 中始终是最新的。我现在正在寻找一种解决方案,将 File1 中的用户名和 Password2 写入变量,然后在 File2 中设置这个新的用户名和密码。

所以作为一个菜鸟,伪代码应该是这样的:

find "username" & "password1" in file1 
set "username" as $UsernameNEW and
    "password1" as $PasswordNEW and
then just execute my sed command.

有人可以帮忙吗?我想我可以为此使用grep?但老实说,我很高兴我得到了这个带有变量的sed 命令:D

【问题讨论】:

  • 您的 OSCam 服务器中有多少阅读器?应该不是很多,所以使用 webgui 更改用户/密码应该是可行的。
  • 我有两个不是关于读者的;)我有很多接收器,它们都与相同的花束等同步,我有一个脚本用一些 IPTV 频道构建花束,为此我需要更改用户/密码,并且用户名和密码在 File1 中
  • 我尝试 awk 来获取行用户和密码 2,但遗憾的是用户和 = 之间有空格,我不知道如何复制“用户名 =”之后的所有内容
  • 一些问题。配置只能包含 1 个 passord pr 用户,你有 2 个?您需要更改用户名吗?如果是,为什么?查找相应用户的新密码很容易,只需更改密码即可。如果您问我,删除用户并使用文件中的新用户名和密码重新创建它会更简单。
  • 这绝对是 awk 的工作,而不是 grep 或 sed。请edit您的问题澄清您的要求并根据您提供的示例输入显示预期输出,以便我们可以测试潜在的解决方案并为您提供帮助。

标签: shell awk sed grep


【解决方案1】:

这里有一些可以帮助您入门。

oscam.conf

[reader]
label                         = anylabel
protocol                      = cccam
device                        = some.url,13377
user                          = xxx1
password                      = password1
inactivitytimeout             = 30
group                         = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
cccversion                    = 2.3.2
ccckeepalive                  = 1


[reader]
label                         = anylabel
protocol                      = cccam
device                        = test.url,13377
user                          = yyy1
password                      = password1
inactivitytimeout             = 30
group                         = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
cccversion                    = 2.3.2
ccckeepalive                  = 1

密码文件的格式我改了一些,但可以用原来的格式。

passwd(格式 oldUser,newUser,oldPass,newUser)

xxx1,xxx2,passxxx1,passxxx2
yyy1,yyy2,passyyy1,passyyy2

awk 命令

awk -F, 'FNR==NR {usr[$1]=$2;pass[$1]=$4;next} FNR!=NR{FS=" = "}  /^user/ {t=$2;$2="= "usr[$2]} /^password/ {$2="= "pass[t]} 1' passwd oscam.reader

结果

[reader]
label                         = anylabel
protocol                      = cccam
device                        = some.url,13377
user                          = xxx2
password                      = passxxx2
inactivitytimeout             = 30
group                         = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
cccversion                    = 2.3.2
ccckeepalive                  = 1


[reader]
label                         = anylabel
protocol                      = cccam
device                        = test.url,13377
user                          = yyy2
password                      = passyyy2
inactivitytimeout             = 30
group                         = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
cccversion                    = 2.3.2
ccckeepalive                  = 1

【讨论】:

    【解决方案2】:

    又快又脏——将旧密码加载到环境参数中:

    set -- $(grep -m1 -A1 '^user' File1)
    sed -i -e "s#/${UsernameOLD}/${PasswordOLD}#/$3/$6#;T;q" /etc/enigma2/file2.cfg
    

    它是如何工作的:grep 输出六个空格分隔的项目,set 变成命令行参数$1 $2 $3 ... $6。我们只需要$3$6

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      • 2015-07-07
      相关资源
      最近更新 更多