我有这个值,来自,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
答案 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
注意:如果它只是替换原始字符串中的字符(没有标记,没有字段),bash
,sed
和tr
最适合。< / 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"
此命令的输出是输入文件的第一列,并进行了替换。