2016-11-09 74 views
0

我有这个价值,从.txt板缺替换:查找和使用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 

我的bug在哪里?

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

Id,dummy1,dummy2,dummyN 

而且应该是:

,Request Id,dummy1,dummy2,dummyN 

要做到这一点的操作,我使用:

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

您的预期产出是多少? – Inian

+0

',Request_Id,dummy1,dummy2,dummyN' –

+2

看起来像'$ user'不包含你的期望。 –

回答

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" 

此命令的输出是输入文件的第一列,与由替换。

+0

在这两个例子中,不应该使用字段分隔符吗? – Inian

+0

这个想法是取代'cut -d:'的使用。 –

0

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

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

随着awk,设置分隔符为,或空格字符将被解释为分隔符。

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

,Request_Id,dummy1,dummy2,dummyN 

注:如果只是替换原始字符串中的字符(没有令牌没有字段),bashsedtr最适合。

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 

这将替换所有的空格与_。请注意,这里有两个/在用户之后使用。这是对整个文本进行搜索和替换操作。如果你只输入一个/,那么搜索和替换将在第一场比赛中完成。