【问题标题】:Find and replace in AIX 5.3AIX 5.3 中的查找和替换
【发布时间】:2015-05-05 23:29:29
【问题描述】:

我正在运行 AIX 5.3。 我有两个平面文本文件。

  • 一个是网络设备的“主”列表,以及它们的通信设置 (CLLIFile.tbl)。
  • 另一个是需要更改一个设置的特定网络设备列表,在主文件中(具体来说,cnle)。列表文件名为DDM2000-030215.txt

我已经遍历DDM2000-030215.txt,将我需要用grep 更改的行从CLLIFile.tbl 拉出,使用sed 将cn 更改为le,并将输出发送到文件。

问题是,我得到的只是改变的线条。我需要在CLLIFile.tbl 中进行更改,因为我不能干扰格式或结构。

到目前为止,这是我们尝试过的:

for i in 'DDM2000-030215.txt'
do
grep -p $ii CLLIFile.tbl| sed s/cn/le/g >> CLLIFileNew.tbl
done

基本上,我需要将“CLLIFile.tbl”中包含“DDM2000-030215.txt”中的网络元素名称的行中的所有“le”实例替换为“cn”。

【问题讨论】:

  • 编辑您的问题以包括示例输入、您的预期输出、您当前正在运行的代码、确切的错误消息。在每行前面使用 4 个空格,使其在您的帖子中“按原样”显示,以避免 S.O. 提供的自动格式化。祝你好运。

标签: file replace sed grep aix


【解决方案1】:

编辑:我明白了,这是一个全新的问题。为此,我会使用 awk:

awk 'NR == FNR { a[++n] = $0; next } { for(i = 1; i <= n; ++i) { if($0 ~ a[i]) { gsub(/cn/, "le"); break } } print }' DDM2000-030215.txt  CLLIFile.txt 

它的工作原理如下:

NR == FNR {                   # when processing the first file
                              # (DDM2000-030215.txt)
  a[++n] = $0                 # remember the tokens. This assumes that every
                              # full line of the file is a search token.
  next                        # That is all.
}
{                             # when processing the second file (CLLIFile.tbl)
  for(i = 1; i <= n; ++i) {   # check all remembered tokens
    if($0 ~ a[i]) {           # if the line matches one
      gsub(/cn/, "le")        # replace cn with le
      break                   # and break out of the loop, because that only
                              # needs to be done once.
    }
  }
  print                       # print the line, whether it was changed or not.
}

请注意,如果DDM2000-030215.txt 的内容将被解释为固定字符串而不是正则表达式,则应在检查中使用index($0, a[i]) 而不是$0 ~ a[i]

【讨论】:

  • 我希望 AIX 5.3 有一个不错的 awk,那么;这比 sed 要明智得多。见编辑。告诉我它是否适合你。
【解决方案2】:

您不希望在此处使用grep,因为正如您所观察到的,它只输出匹配的行。您只想使用 sed 并让它仅在匹配的行上进行替换,同时将其他行不变地传递。

所以不要这样:

 grep 'pattern' | sed 's/old/new/'

这样做:

sed '/pattern/s/old/new/' 

您必须将输出发送到一个新文件中,然后将该新文件移动到位以替换旧的CLLIfile.tbl。像这样的:

cp CLLIfile.tbl CLLIfile.tbl.bak # make a backup in case something goes awry
sed '/pattern/s/old/new/' CLLIfile.tbl >newclli && mv newclli CLLIfile.tbl

【讨论】:

    【解决方案3】:

    您的 sed(在 AIX 上)将没有 -i 选项(编辑输入文件), 并且您不想使用临时文件。
    您可以使用 vi 尝试此处的构造:

    vi CLLIFile.tbl >/dev/null <<END
    :1,$ s/cn/le/g
    :wq
    END
    

    【讨论】:

      猜你喜欢
      • 2022-12-11
      • 2011-12-31
      • 2010-12-22
      • 2010-11-16
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多