【问题标题】:find value but replace another in another line via bash查找值但通过 bash 在另一行中替换另一个值
【发布时间】:2017-01-22 00:39:48
【问题描述】:

我必须将一些页面移动到另一台主机,但是数据库 IP 被拆分了。 所以我必须找到用户名的值并替换 IP 上方的两行

我试过了:

#!/bin/bash

OUTPUT="$(find /home/user/files/script/test-file -maxdepth 1 -iname  file_with_many_sqlconnections.php -exec grep -Hina -B 2 u1_3347 {} \; | grep 172)"

echo "${OUTPUT}"

LINE="$(echo "$OUTPUT" | cut -d"-" -f3 )"
echo "${LINE}"

FILE="$(echo "$OUTPUT" | cut -d"-" -f1,2)"

echo "${FILE}"

CONTENT="$(echo "$OUTPUT" | cut -d"-" -f4 | cut -d"." -f4 | cut -d "\"" -f1)"

echo "${CONTENT}"

gawk -v line="$LINE" -v content="$CONTENT" -v file="$FILE" -i inplace "NR=="line"{gsub("content", 177)}1" "$FILE"

我尝试了几种变量组合,quotevariants,反之亦然。 我也尝试了sedperl,但是要么我得到了垃圾作为输出,要么EOF 之后出现了换行问题,要么gawk 忽略了换行并试图在一个命令中填充所有内容。

我使用echo 段仅用于查看结果是否正常,并且当我在 shell 中看到它时,它“显示”它很好。

问题

  $db = mysql_connect("172.1.1.178",
     "u2_3456","pass6");


    $db = mysql_connect("172.1.1.178",
     "u1_3347","pass7");


    $db = mysql_connect("172.1.1.178",
     "u1_3347","pass7");


    $db = mysql_connect("172.1.1.178",
     "u2_3456","pass6");


    $db = mysql_connect("172.1.1.178",
     "u1_3347","pass7");

应该是:

 $db = mysql_connect("172.1.1.178",
  "u2_3456","pass6");


 $db = mysql_connect("172.1.1.180",
  "u1_3347","pass7");


 $db = mysql_connect("172.1.1.180",
  "u1_3347","pass7");


 $db = mysql_connect("172.1.1.178",
  "u2_3456","pass6");


 $db = mysql_connect("172.1.1.180",
  "u1_3347","pass7");


 $db = mysql_connect("172.1.1.180",
  "u1_3347","pass7");

问题

  $db = mysql_connect("172.1.1.178",
     "u2_3456","pass6");


    $db = mysql_connect("172.1.1.178",
     "u1_3347","pass7");

【问题讨论】:

  • 请添加示例 i/p 和正确的预期输出/
  • 为什么这个标签是“perl”?
  • 我把它放到了 pastebin,因为我在这里遇到了格式问题pastebin.com/62XG4jkw 我也用 perl 试过,所以在这种情况下是一个错误,对不起
  • 请解释您遇到的格式问题。特别是通过单击明显的按钮{} 来解释我应用的格式有什么问题。如果您无法解释,请研究 StackOveflow 格式化帮助。
  • 我发现您的措辞“上面两行”与您提供的引号之间存在矛盾。

标签: bash perl sed grep gawk


【解决方案1】:

处理您的示例输入(即跳过文件读取等):

perl -0777 -pe "s/(\$db = mysql_connect\()\"\d+\.\d+\.\d+\.\d+(\",\s*\n)\s*(\"u1_3347\")/ \1\"172.1.1.180\2  \3/g"

详情:

  • 使用-0777完全吃掉输入,
    允许模式跨换行匹配
  • -pe 默认循环输入和打印结果
  • 查找几乎任何 IP 地址,
    嵌入在所需输入行的特征其他部分中
  • 专门寻找需要更改 IP 的用户
  • 从空格、捕获组和新 IP 组装新的输出线
  • 无处不在g

输出(根据需要,除了空白修补和只有五个示例输入条目):

  $db = mysql_connect("172.1.1.178",
     "u2_3456","pass6");


     $db = mysql_connect("172.1.1.180",
  "u1_3347","pass7");


     $db = mysql_connect("172.1.1.180",
  "u1_3347","pass7");


    $db = mysql_connect("172.1.1.178",
     "u2_3456","pass6");


     $db = mysql_connect("172.1.1.180",
  "u1_3347","pass7");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2016-11-26
    • 2017-11-27
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多