我正在尝试像这样编辑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 ...
答案 0 :(得分:3)
最简单的方法是使用awk:
假设您要替换字段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
:将所有内容置于第四列之前,新字段中,并将所有内容置于第四列之后。这种方式没有匹配的任何内容,只要您尊重用','分隔的列,这种方式便始终有效。