首页 > 解决方案 > 在 UNIX 中查找和替换

问题描述

我在一个名为的文件中有以下字符串test.txt

test.log test1.log test2.log

我想用

test.log -A test1.log -A test2.log

我试过了:

sed -i 's/.log/.log -A/g' test.txt

但输出是

test.log -A test1.log -A test2.log -A

我不希望将其附加到最后一个文件中。有人可以帮我吗?

标签: sed

解决方案


如果参数由空格分隔,并且行中的最后一个参数后面没有空格,则可以使用:

$ cat ip.txt
test.log test1.log test2.log

$ sed 's/\.log /&-A /g' ip.txt
test.log -A test1.log -A test2.log
  • 因为.是一个元字符,你必须使用\.它来匹配它
  • &在替换部分表示搜索部分中的整个匹配部分


您也可以awk在此处使用,更适合字段处理,并增加在行首/行尾去除空格的优势

$ awk -v OFS=' -A ' '/\.log/{$1=$1} 1' ip.txt
test.log -A test1.log -A test2.log
  • 默认输入字段分隔符(FS)是一个或多个连续的空白,因此无需设置
  • -v OFS=' -A '设置空格后跟-A空格作为输出字段分隔符(OFS)
  • /\.log/如果行包含.log
    • $1=$1重新构建输入记录,使输入FS被OFS替换
  • 1打印输入记录的惯用方式
  • 请注意,如果此解决方案不包含.log

推荐阅读