2016-11-20 112 views
-1

我有一個文本文件。這個文件有5行5列。所有列由「|」分隔(符號)。在第二列(內容)長度應該是7個字符。Unix Shell腳本 - 如何刪除文本文件中的特定字符?

如果第二列的長度超過7個字符。然後,我想在不打開該文件的情況下刪除這些額外的字符。

例如:

cat file1 

FF | haha​​ha1 | kjbsb | 122344 | jbjbnjuinnv |

df | hadb123_udcvb | sbfuisdbvdkh | 122344 | jbjbnjuinnv |

gf | harayhe_jnbsnjv | sdbvdkh | 12234 | jbjbnj |

qq | kkksks2 | datetag | 7777 | jbjbnj |

jj | harisha | hagte | 090900 | hags |

對於上述情況,第二列長度的第二行和第三行超過7個字符。現在我想刪除那些額外的字符,而無需使用awk或sed命令打開輸入文件

我在等待你的回覆。

在此先感謝!

+0

看到https://stackoverflow.com/editing-help,爲了清晰起見添加預期輸出效果更好,也可以https://stackoverflow.com/help – Sundeep

+2

如果不打開文件,則無法編輯文件。 –

+1

目前尚不清楚你的「沒有打開輸入文件」的要求意味着什麼。爲了讀取輸入文件,文件_必須被打開。如果你只是不想_overwrite_輸入文件,你可以寫入臨時文件(如@ TomFenech的答案)。 – e0k

回答

2

徑長度爲7的子串從第二塔以AWK:

awk -F'|' -v OFS='|' '{ $2 = substr($2, 1, 7) }1' file 

現在超過7個字符的任何字符串將被縮短。任何較短的字符串將保留原樣。

1最後是最短的true條件觸發默認動作{ print }

如果你高興的變化,則可以覆蓋原來的文件是這樣的:

awk -F'|' -v OFS='|' '{ $2 = substr($2, 1, 7) }1' file > tmp && mv tmp file 

即重定向到一個臨時文件,然後覆蓋原來的。

0

首先嚐試

sed 's/\(^[^|]*|[^|]\{7\}\)[^|]*/\1/' file1 

這到底是怎麼回事?我們構建的命令一步一步:

# Replace something 
sed 's/hadb123_udcvb/replaced/' file1 
# Remember the matched string (will be used in a later command) 
sed 's/\(hadb123_udcvb\)/replaced/' file1 
# Replace a most 7 characters without a '|' (one time each line) 
sed 's/\([^|]\{7\}\)/replaced/' file1 
# Remove additional character until a '|' 
sed 's/\([^|]\{7\}\)[^|]*/replaced/' file1 
# Put back the string you remembered 
sed 's/\([^|]\{7\}\)[^|]*/\1/' file1 
# Extend teh matched string with Start-of-line (^), any-length first field, '|' 
sed 's/\(^[^|]*|[^|]\{7\}\)[^|]*/\1/' file1 

當這顯示了所需的輸出,你可以添加選項-i改變輸入文件:

sed -i 's/\(^[^|]*|[^|]\{7\}\)[^|]*/\1/' file1 
相關問題