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

Awk 如何使用sed替换多行中的单词?,awk,sed,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 ..

我正在尝试编辑如下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 -e 's/FIELD I WANT TO REPLACE/NEW FIELD/' input_file >output_file
我是否可以使用
sed
替换搜索我要替换的模式
字段
并切换以下内容:

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 ...

你想要的只是一个简单的查找和替换吗?如果是这样,请尝试以下方法:

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 -e 's/FIELD I WANT TO REPLACE/NEW FIELD/' input_file >output_file
如果您正在寻找更多信息,请进一步解释


希望这能有所帮助。

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

因此,我的
sed
匹配:

  • 一个字符后跟:
  • *,*,*
    :3列
  • ,*,
    :第4列。我决定在第四列加上逗号,以便更清楚地阅读
  • *
    :第4列后面的所有内容
  • \1,新字段,\2
    :将所有内容放在第4列之前、新字段以及第4列之后
这样就没有任何匹配的内容,只要您尊重由“,”分隔的列,它就会一直工作。

最简单的方法是使用:

假设您要替换字段5

awk 'BEGIN{FS=OFS=","}{$5="SOME NEW TEXT"}1' file

根据你想要做的评论

$ sed -i.bak 's/,Service desk procedure1,/,Service desk procedure2,/' file
如果搜索的字符串作为子字符串存在于其他地方,则逗号用于消除意外匹配。另外,没有设置
g
标志,我们将每行限制为一个匹配


这将进行替换,旧版本将改名为代码> BAK<代码>后缀.< /P> < P>您可以考虑适当的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
这可能适用于您(GNU-sed):


将第四次出现的零个或多个非逗号字符替换为文字
新字段

除初始字段外,所有行是否都相同?如果不是,匹配和替换的值在哪里?问题是,如果第二行中的值与第一个字段中的值不同,您希望如何匹配它们并将其替换为值?也许您想更改csv文件中的第4列?主机名、客户端名称、ID标记、操作系统、位置、注释、服务台程序1、字段主机名、客户端名称、ID标记、操作系统、位置、注释、服务台程序1、字段主机名、客户端名称、ID标记、操作系统、位置、注释、服务台程序1、字段,我想更改为主机名、客户端名称、ID标记、操作系统、位置,注释,服务台程序2,字段主机名,clientname,ID标记,操作系统,位置,注释,服务台程序2,字段主机名,clientname,ID标记,操作系统,位置,注释,服务台程序2,字段我通常使用atom或notepad++来做这件事,但由于超过20k行,应用程序崩溃。对不起,这不是StackOverflow的工作方式。形式为“我想做X,请给我提示和/或示例代码”的问题被认为是离题的。请访问并阅读,特别是阅读您的问题不清楚。您是要替换我要替换的文本
字段,无论它出现在哪里,还是要替换第四个字段中的任何文本?
sed 's/[^,]*/NEW FIELD/4' file