查找并替换为awk

时间:2016-11-09 13:47:16

标签: bash awk

我有这个值,来自,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

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

cool

3 个答案:

答案 0 :(得分:1)

您可以尝试使用bash搜索并替换substring:

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

这将用_替换所有空格。请注意,此处在用户之后使用了两个/。这是对整个文本进行搜索和替换操作。如果您只放置一个/,那么搜索和替换将在第一场比赛时完成。

答案 1 :(得分:0)

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

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

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

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

,Request_Id,dummy1,dummy2,dummyN

注意:如果它只是替换原始字符串中的字符(没有标记,没有字段),bashsedtr最适合。< / p>

答案 2 :(得分:0)

您的问题是您使用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"

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