如何使用sed替换多行中的单词?

时间:2018-09-24 14:50:11

标签: awk sed

我正在尝试像这样编辑CSV文件:

1:field1,field2,field3,FIELD I WANT TO REPLACE, fieldx ...
2:field1,field2,field3,FIELD I WANT TO REPLACE, fieldx ...
3:field1,field2,field3,FIELD I WANT TO REPLACE, fieldx ...
5:field1,field2,field3,FIELD I WANT TO REPLACE, fieldx ...

我可以使用sed代替搜索模式FIELD I WANT TO REPLACE并切换类似的内容吗:

1:field1,field2,field3,NEW FIELD, fieldx ...
2:field1,field2,field3,NEW FIELD, fieldx ...
3:field1,field2,field3,NEW FIELD, fieldx ...
5:field1,field2,field3,NEW FIELD, fieldx ...

6 个答案:

答案 0 :(得分:3)

最简单的方法是使用

假设您要替换字段5

public class Employee extends Model {
    static {
        addScope("byDepartment", "department = '?'");
    }
}

答案 1 :(得分:1)

根据您要尝试的评论

$ sed -i.bak 's/,Service desk procedure1,/,Service desk procedure2,/' file
如果搜索到的字符串作为子字符串存在于其他位置,则

可以消除意外匹配。同样没有设置g标志,我们限制为每行只有一个匹配项。

这将进行就地替换,并且旧版本将使用后缀.bak重命名。

答案 2 :(得分:1)

您可能会考虑使用适当的CSV解析器。例如,ruby附带一个:

ruby -rcsv -e '
  f = ARGV.shift
  # read the data
  data = CSV.read(f)
  # make your updates
  data.each {|row| row[6]="Service desk procedure2"}
  # write back to the file
  CSV.open(f, "w") {|csv| data.each {|row| csv << row}}
' file

或一成不变的单线(尽管我了解红宝石界对此并不满意)

ruby -rcsv -i.bak -ne 'CSV.parse($_) {|row| row[6]="foo"; puts CSV.generate_line(row)}' file

答案 3 :(得分:1)

这可能对您有用(GNU sed):

sed 's/[^,]*/NEW FIELD/4' file

用文字NEW FIELD代替第四个出现的零个或多个非逗号字符。

答案 4 :(得分:0)

是否只需要简单查找和替换?如果是这样,请尝试以下操作:

sed -e 's/FIELD I WANT TO REPLACE/NEW FIELD/' input_file >output_file

如果您想寻找更多东西,请进一步解释。

希望这会有所帮助。

答案 5 :(得分:0)

这可行,但是我希望那里有更优雅的解决方案(可能是awk):

#!/bin/bash

echo "1:field1,field2,field3,FIELD I WANTawef TO REPfLACE, fieldx ..." > data.txt
echo "1:field1,field2,field3,FIELD I wefaaWANT TO REPLACE, fieldx ..." >> data.txt
echo "1:field1,field2,field3,FIELD I WANT TO REPawefL ACE, fieldx ..." >> data.txt
echo "1:field1,field2,field3,FIEawefLDa I WANT TO REPLACE, fieldx ..." >> data.txt

sed -e 's/\(.:.*,.*,.*\),.*,\(.*\)/\1,NEW FIELD,\2/' data.txt

所以我的sed符合条件:

  • .: 1个字符,后跟:
  • .*,.*,.* :3列
  • ,.*, :第四列。我决定在第四栏中添加逗号,以便于阅读
  • .* :第四列之后的所有内容
  • \1,NEW FIELD,\2 :将所有内容置于第四列之前,新字段中,并将所有内容置于第四列之后。

这种方式没有匹配的任何内容,只要您尊重用','分隔的列,这种方式便始终有效。