如何进行搜索,输入文字并替换bash中的一行?

时间:2018-07-02 04:36:08

标签: bash

我一直在尝试编写bash代码(实验),其中bash会询问(输入文本),而用户会输入特定的文本,例如(我是新用户),文本(我是新用户)将被移动到名为User = I new的行。

因此,这是一个名为 xyz.cfg

的cfg文件
User 
Name 
Address 
Country

这是名为 test 的bash脚本,仅使用 echo $ Input> $ file ,bash会用输入的文本替换整个文件>,但我想保持配置不变,并在 User 行中添加 Enter Text:值,但这对下面的代码没有帮助

#! /bin/sh
file=/root/xyz.cfg
echo "Enter text:"
read Input
echo $Input > $file **(confused here)** **(it replaces the whole cfg)**

我想到的另一行在这里,但是它不起作用。我对这些不好,所以我希望解决。我试图以零运气搜索网络。

(无效)

#! /bin/sh
file=/root/xyz.cfg
echo "Enter text:"
read Input
echo $Input > sed '/User/a' xyz.cfg

(无效)

#! /bin/sh
file=/root/xyz.cfg
echo "Enter text:"
read Input
echo $Input > sed '/User/a' $file

编辑:

在运行bash脚本 ./ test 时要求某人输入文本时,某人键入了从bash促销中输入文本输入的$ Input( )应移至 xyz.cfg 并将行添加到变量 User:

最后, xyz.cfg 应该看起来像

    User: Entered Text from bash prompt
    Name 
    Address 
    Country

在看起来像这样之前,

    User: 
    Name
    Address 
    Country

Edit2:This GIF可能会解释我的需求。

1 个答案:

答案 0 :(得分:0)

这应该可以解决问题:

#!/bin/bash
FILE=/tmp/test.cfg

echo -n "Enter text: "
read INPUT
sed -i "s/User:/& $INPUT/" "$FILE"

此方法使用sed进行就地搜索/替换(-i),该操作将在User:内的每一行上首次出现$FILE之后追加输入的文本。

&指的是文本的匹配部分-本质上是说“将<thing>替换为<thing> <entered text>。”


如果每次遇到匹配的User:行时都需要提示输入文本,则可以使用以下方法:

#!/bin/bash
FILE=/tmp/test.cfg
ORIGINAL=$(cat "$FILE")

truncate -s 0 "$FILE"
while read LINE; do
    if `grep -q 'User:' <<< "$LINE"`; then
        echo -n "Enter text: "
        read INPUT < /dev/tty
        sed "s/User:/& $INPUT/" <<< "$LINE" >> "$FILE"
    else
        echo "$LINE" >> "$FILE"
    fi
done <<< "$ORIGINAL"

第二种方法执行以下操作:

  1. 将整个文件内容读入一个变量;
  2. 删除现有文件内容;
  3. 遍历原始内容的每一行,并且:
    1. 如果该行包含User:,请提示并附加自定义文本;
    2. 将行添加到文件中。