2016-11-09 31 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 

這將替換所有的空格與_。請注意,這裏有兩個/在用戶之後使用。這是對整個文本進行搜索和替換操作。如果你只輸入一個/,那麼搜索和替換將在第一場比賽中完成。