【问题标题】:Find and Replace with awk用 awk 查找和替换
【发布时间】:2016-11-09 22:22:41
【问题描述】:

我有这个值,从.txt删减:

,Request Id,dummy1,dummy2,dummyN

我正在尝试查找并用“_”替换空格,如下所示:

#iterator to read lines of txt
#if conditions
trim_line=$(echo "$user" | awk '{gsub(" ", "_", $0); print}')
echo $trim_line

但回声显示:

Id,dummy1,dummy2,dummyN

预期输出:

,Request_Id,dummy1,dummy2,dummyN

我的错误在哪里?

编辑: 用户的回声不是预期的,是:

Id,dummy1,dummy2,dummyN

应该是:

,Request Id,dummy1,dummy2,dummyN

要执行此操作,我正在使用:

for user in $(cut -d: -f1 $FILENAME)
do (....) find/replace

【问题讨论】:

  • 你的预期输出是什么?
  • ,Request_Id,dummy1,dummy2,dummyN
  • 看起来$user 不包含您所期望的内容。
  • echo $user 的输出是什么?
  • 虽然我仍然认为您应该使用 tr 而不是 awk,但看起来这不是您当前的问题:echo ",Request Id,dummy1,dummy2,dummyN" | awk '{gsub(" ", "_", $0); print}' 正确输出 ,Request_Id,dummy1,dummy2,dummyN

标签: bash awk


【解决方案1】:

您可以尝试 bash 搜索和替换子字符串:

 echo $user
,Request Id,dummy1,dummy2,dummyN
 echo ${user// /_}                   ## For all the spaces
,Request_Id,dummy1,dummy2,dummyN
 echo ${user/ /_}                   ## For first match

这会将所有空格替换为_。请注意,这里有两个/ 在用户之后使用。这是对整个文本进行搜索和替换操作。如果您只输入一个/,则搜索和替换将在第一个匹配项上完成。

【讨论】:

    【解决方案2】:

    您的问题是您使用for 循环来读取文件的内容。 shell 将您的命令替换 $(cut -d: -f1 $FILENAME) 的输出拆分为空白,并且您的行中间有一个,因此它会中断。

    使用while read循环逐行读取文件:

    while IFS=: read -r col junk; do
        col=${col// /_}
        # use $col here
    done < "$FILENAME"
    

    正如其他人所提到的,无需使用外部工具进行替换。

    ...也就是说,如果您不打算对每一行执行不同的操作(例如执行其他命令),那么最好的选择是使用 awk:

    awk -F: '{ gsub(/ /, "_", $1); print $1 }' "$FILENAME"
    

    此命令的输出是输入文件的第一列,并进行了替换。

    【讨论】:

    • 在这两个例子中,字段分隔符不应该是 吗?
    • 这个想法是替换cut -d:的使用。
    【解决方案3】:

    如果您的数据已经在环境变量中,最快的方法是直接使用内置的 bash 替换功能:

    echo "${user// /_/}"
    

    使用awk,将分隔符设置为,,否则空格字符将被解释为分隔符。

    echo ",Request Id,dummy1,dummy2,dummyN" | awk -F, '{gsub(" ", "_", $0); print}'
    
    ,Request_Id,dummy1,dummy2,dummyN
    

    注意:如果只是替换原始字符串中的字符(无标记,无字段),bashsedtr 最适合。

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 2014-07-07
      • 1970-01-01
      • 2020-02-03
      • 2017-11-11
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 2013-12-23
      相关资源
      最近更新 更多