【问题标题】:Find line using variable string, replace whole line with another line generated from nested loop使用变量字符串查找行,用嵌套循环生成的另一行替换整行
【发布时间】:2017-04-03 15:08:48
【问题描述】:

我有一个以:

开头的脚本
sed 's!'$1'!'$2'!g' file.txt > new.txt ;

$1 和 $2 是变量,第三个变量 $3 稍后在脚本中使用,脚本以这种格式执行:

./script.sh variable variable2 variable3

脚本的下一部分将第三个变量添加到文本文件中:

sed "s!><!> $3 <!4" newer.txt > newest.txt

我现在要做的是使用“newest.txt”的输出(这是一行,包括像 /"/ 这样的字符,因为它在 html 中)并替换另一个文件中的一行,该文件使用 variable2 标识作为比赛。

这是我所拥有的,但它似乎并没有取代整行,只是部分。

for i in `cat newest.txt` ;
do
sed '/$2/s/.*/$i/' new.txt > final.txt
done

我在使用 sed 时不允许使用 -i 开关的 Solaris。 sed、awk 或 bash 会更好。

提前致谢!

【问题讨论】:

  • 一些示例数据和预期输出怎么样?

标签: bash awk replace sed line


【解决方案1】:

使用r 命令从文件中读取将是稳健的,因为它不会因文件内容或多行文件输入而中断

sed -e "/$2/r newest.txt" -e "/$2/d" new.txt > final.txt

sed -e "/$2/r newest.txt" -e '//d' new.txt > final.txt

感谢@mklement0 指出替换内容会影响结果,我们可以为d 命令重用模式:


举例说明各种情况:

$ cat ip.txt 
foo
bar
baz
123

$ s='ba'
$ echo 'XYZ' > f1
$ r=$(<f1)

$ sed "/$s/s/.*/$r/" ip.txt 
foo
XYZ
XYZ
123

$ sed "/$s/c$r" ip.txt 
foo
XYZ
XYZ
123

$ sed -e "/$s/r f1" -e '//d' ip.txt 
foo
XYZ
XYZ
123

如果替换字符串包含像/这样的字符

$ echo '/XYZ/' > f1
$ r=$(<f1)

$ sed "/$s/s/.*/$r/" ip.txt 
sed: -e expression #1, char 11: unknown option to `s'

$ sed "/$s/c$r" ip.txt 
foo
/XYZ/
/XYZ/
123

$ sed -e "/$s/r f1" -e '//d' ip.txt 
foo
/XYZ/
/XYZ/
123

对于多行:

$ echo -e 'XYZ\nABC' > f1
$ r=$(<f1)

$ sed "/$s/s/.*/$r/" ip.txt 
sed: -e expression #1, char 12: unterminated `s' command

$ sed "/$s/c$r" ip.txt 
sed: -e expression #1, char 10: unknown command: `A'

$ sed -e "/$s/r f1" -e '//d' ip.txt 
foo
XYZ
ABC
XYZ
ABC
123

注意:某些sed 版本可能需要sed "/$s/c\\$r" ip.txt,其中c\c 命令的用法。双引号内\需要转义

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 2018-01-14
    • 2019-10-23
    • 2017-06-16
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    相关资源
    最近更新 更多