我正在處理文本檔案上的資料,但我找不到使用 sed 選擇固定位置的子字串并替換它的方法。
這就是我所擁有的:
X|0012000000000000000000098765432|1234567890|TQ
這就是我需要的:
'X','00000098765432','1234567890','TQ'
sed 中的以下代碼給出了我需要的子字串 (00000098765432) 但不覆寫需要的位置
回聲“X|0012000000000000000000098765432|1234567890|TQ”| sed “s/ *//g;s/|/','/g;s/^/'/;s/$/'/”
你可以幫幫我嗎?
uj5u.com熱心網友回復:
而不是sed,我會用awk這個。
echo "X|001200000000000000000098765432|1234567890|TQ" | awk 'BEGIN {FS="|";OFS=","} {print $1,substr($2,17,14),$3,$4}'
給出輸出:
X,00000098765432,1234567890,TQ
下面是它的作業原理:
FS= 欄位分隔符(在輸入中)
OFS= 輸出欄位分隔符(您希望輸出分隔的方式)
BEGIN-> 將其視為設定配置的地方。它只運行一次。所以你說你希望輸出用逗號分隔,輸入用管道分隔。
substr($2,17,14)-> 取 $2(即第二個欄位 - awk 從 1 開始計數 - 然后在其上應用子字串。17 表示開始字符位置,14 表示從該位置開始的字符數)
在我看來,這比您擁有的 sed 版本更具可讀性和可維護性。
uj5u.com熱心網友回復:
如果你想加上引號,我仍然會使用awk.
$: awk -F'|' 'BEGIN{q="\047"} {print q $1 q","q substr($2,17,14) q","q $3 q","q $4 q"\n"}' <<< "X|001200000000000000000098765432|1234567890|TQ"
'X','00000098765432','1234567890','TQ'
如果您只想使用sed,請注意上面說您要洗掉 16 個字符,但實際上您只洗掉了 14 個字符。
$: sed -E "s/^(.)[|].{14}([^|] )[|]([^|] )[|]([^|] )/'\1','\2','\3','\4'/" <<< "X|0012000000000000000098765432|1234567890|TQ"
'X','00000098765432','1234567890','TQ'
uj5u.com熱心網友回復:
使用sed
$ sed "s/|\(0[0-9]\{15\}\)\?/','/g;s/^\|$/'/g" input_file
'X','00000098765432','1234567890','TQ'
uj5u.com熱心網友回復:
awk -v d1="\047" \
-v d2="," \
-v s="3" \
-v l="17" \
'{
gsub(substr($0,s 1,l),"");
gsub(/[\|]/,d1 d2 d1);
print d1$0d1
}' input_file
'X',00000098765432','1234567890','TQ'
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/471507.html
