簡體   English   中英

從Bash中的行中刪除中間的n個字符

[英]Remove the middle n characters from lines in Bash

我試圖在文件中刪除每行的中間。 所有的行都是這樣的:

79.472850   97 SILENCE 

我需要最終得到:

79.472850 SILENCE

由於每一行都有不受歡迎的部分從字符10開始到字符14結束,我試圖以這種方式使用sed:

sed "s/\\(.\\{9\\}\\).\\{6\\}//"但我最終得到了字符14之后的所有內容。每個文件中標簽空間后面的數字都會發生變化。 我該怎么做才能使sed切掉標簽和兩位數字?

謝謝你的幫助。

根據您的輸入和預期輸出,這可能是一種方式:

$ echo "79.472850   97 SILENCE" | tr -s " " | cut -d" " -f1,3
79.472850 SILENCE
  • tr -s " "刪除重復的空格。
  • cut -d" " -f1,3根據空格分割打印第1和第3個字段。

sed

$ sed 's#\([^ ]*\)[ ]*\([^ ]*\)[ ]*\([^ ]*\)#\1 \3#g' <<< "79.472850   97 SILENCE"
79.472850 SILENCE

看起來您需要輸入中的第一個和第三個字段

$ echo "79.472850   97 SILENCE" | awk '{print $1, $3}'
79.472850 SILENCE

無需調用sedcut等外部程序,或其他語言如awkbash可以為您完成:

var="79.472850   97 SILENCE"
echo ${var:0:9}${var:14}
79.472850 SILENCE

${var:0:9}從位置0(文本開頭)開始復制9個字符。

${var:14}從字符位置14復制到文本末尾。

或者,如果它是以空格分隔的字段,則需要:

read one two three <<< "$var"
echo "$one $three"
79.472850 SILENCE

再次,這使用純粹的bash。

這是一個awk解決方案,即使您的第三列中有空格也可以使用:

awk '{$2=""; print}' file

其中$2=""清空第二列並print輸出所有列。

如果你想完全像你用sed描述的那樣提取:

kent$  echo "79.472850 97 SILENCE"|sed -r 's/(^.{9})(.{4})(.*)/\1 \3/'
79.472850 SILENCE

如果你想從你的空格分隔輸入中提取第1和第3 /最后一列,你可以使用awk: awk '$2="";7'

kent$  echo "79.472850 97 SILENCE"|awk '$2="";7'
79.472850  SILENCE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM