如何在bash中进行搜索、输入文本和替换行?

如何在bash中进行搜索、输入文本和替换行?,bash,Bash,我一直在尝试编写一个bash代码(实验),其中bash将询问(输入文本),用户将输入一个特定的文本,比如说(我是新的),文本(我是新的)将移动到一个名为user=I am new的行 因此,这里有一个名为xyz.cfg User Name Address Country 这是名为test的bash脚本,仅使用echo$Input>$filebash将整个文件替换为输入的文本,但我希望保持配置不变,并将输入文本:值添加到User行,但这没有帮助,下面的代码 #! /bin/sh file=

我一直在尝试编写一个bash代码(实验),其中bash将询问(输入文本),用户将输入一个特定的文本,比如说(我是新的),文本(我是新的)将移动到一个名为user=I am new的行

因此,这里有一个名为xyz.cfg

User 
Name 
Address 
Country
这是名为test的bash脚本,仅使用echo$Input>$filebash将整个文件替换为输入的文本,但我希望保持配置不变,并将输入文本:值添加到User行,但这没有帮助,下面的代码

#! /bin/sh
file=/root/xyz.cfg
echo "Enter text:"
read Input
echo $Input > $file **(confused here)** **(it replaces the whole cfg)**
我想到的另一行在这里,但它不起作用。我不擅长这些,所以我希望它得到解决;我试着用零运气搜索网络

(不起作用)

(不起作用)

编辑:

当某人在运行bash脚本时被要求输入文本:/test,并且某人在bash promot中输入了文本(从bash promot中输入的文本))应移动到xyz.cfg并将该行添加到变量用户:

最后,xyz.cfg应该如下所示

    User: Entered Text from bash prompt
    Name 
    Address 
    Country
在它看起来像这样之前

    User: 
    Name
    Address 
    Country

Edit2:可能会解释我需要什么。

这应该可以做到:

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

echo -n "Enter text: "
read INPUT
sed -i "s/User:/& $INPUT/" "$FILE"
这使用sed执行就地搜索/替换(
-i
),在第一次出现
用户:
后在
$FILE
中的每一行追加输入的文本

&
指的是文本中匹配的部分,它实质上是说“用
替换


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

#!/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"
#/bin/bash
文件=/tmp/test.cfg
原始=$(类别“$文件”)
截断-s 0“$FILE”
读行时;做
如果“grep-q”用户:“$FILE”
fi

完成:您希望在文件中每次替换时都收到提示,还是整个文件只收到一次提示?一次或两次或三次,但现在让我们只说一次,但它应该询问,输入Line:并且当用户在Enter Line:name脚本中键入时,应在xyz.cfg中为Line user添加名称。请澄清关于提示数量的实际需要?“每个文件一次”和“文件中每个用户一次”之间的区别很明显。此外,文件最终应该是什么样子?@Erayd#/bin/sh file=/root/xyz.cfg echo“输入文本:“读取输入echo$Input>$文件(此处混淆)(它替换整个cfg)参考您的第一个答案,#/bin/bash FILE=/tmp/test.cfg echo-n“Enter text:”read-INPUT sed-i“s/User:/&$INPUT/“”$FILE”**我希望bash脚本在文件(test.cfg)的末尾创建一个新行,命名为输入值和输入的文本,我如何实现这一点,我希望test.cfg中的输入类似于输入值NEWLINEENTERED,其中用户将仅键入NEWLINEENTERED,但输入值文本应自动写入test.cfg文件的末尾,并且在输入值行之后,输入的文本应出现。我怎样才能做到这一点?
echo
不带任何参数将输出换行符。关于第二个问题,请您重新措辞好吗?我不明白你想要实现什么。举个例子也许会有帮助。我用echo修复了它。谢谢顺便问一下,您知道如何更改终端默认颜色吗?
#!/bin/bash
FILE=/tmp/test.cfg

echo -n "Enter text: "
read INPUT
sed -i "s/User:/& $INPUT/" "$FILE"
#!/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"