删除Bash中各行中间的n个字符

9wbgstp7  于 2022-11-04  发布在  Unix
关注(0)|答案(6)|浏览(182)

我试着把一个文件中每一行的中间都剪掉。所有的行都是这样的:

79.472850   97 SILENCE

最后我需要得到:

79.472850 SILENCE

由于每一行都有从字符10开始到字符14结束的不需要的部分,我尝试以这种方式使用sed:
sed "s/\(.\{9\}\).\{6\}//",但我最终得到了字符14之后的所有内容。制表符空格后面的数字在每个文件中都会改变。我该怎么做才能使sed只删除制表符和两个数字呢?
谢谢你的帮助。

rn0zuynd

rn0zuynd1#

根据您的输入和预期输出,这可以是一种方式:

$ echo "79.472850   97 SILENCE" | tr -s " " | cut -d" " -f1,3
79.472850 SILENCE
  • tr -s " "删除重复的空格。
  • cut -d" " -f1,3根据空格分割打印第一个和第三个字段。

对于sed

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

kxkpmulp2#

不需要调用sedcut等外部程序,也不需要调用awk等其他语言,bash就可以为您做到这一点:

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。

bvjxkvbb

bvjxkvbb3#

看起来您需要输入中的第一个和第三个 * 字段 *:

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

h7appiyu4#

下面是一个awk解决方案,即使在第三列中有空格也能工作:

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

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

u4vypkhs

u4vypkhs5#

如果您希望完全按照sed描述进行提取:

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

如果您想从空格分隔的输入中提取第一列和第三列/最后一列,您可以使用awk:awk '$2="";7'

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

insrf1ej6#

如果要删除/替换的模式是已知的,那么可以使用纯Bash替换它(使用null):

VAR="79.472850   97 SILENCE"
echo "${VAR/   97}"
79.472850 SILENCE

相关问题