我试着把一个文件中每一行的中间都剪掉。所有的行都是这样的:
79.472850 97 SILENCE
最后我需要得到:
79.472850 SILENCE
由于每一行都有从字符10开始到字符14结束的不需要的部分,我尝试以这种方式使用sed:sed "s/\(.\{9\}\).\{6\}//",但我最终得到了字符14之后的所有内容。制表符空格后面的数字在每个文件中都会改变。我该怎么做才能使sed只删除制表符和两个数字呢?谢谢你的帮助。
sed "s/\(.\{9\}\).\{6\}//"
rn0zuynd1#
根据您的输入和预期输出,这可以是一种方式:
$ echo "79.472850 97 SILENCE" | tr -s " " | cut -d" " -f1,3 79.472850 SILENCE
tr -s " "
cut -d" " -f1,3
对于sed:
sed
$ sed 's#\([^ ]*\)[ ]*\([^ ]*\)[ ]*\([^ ]*\)#\1 \3#g' <<< "79.472850 97 SILENCE" 79.472850 SILENCE
kxkpmulp2#
不需要调用sed或cut等外部程序,也不需要调用awk等其他语言,bash就可以为您做到这一点:
cut
awk
var="79.472850 97 SILENCE" echo ${var:0:9}${var:14} 79.472850 SILENCE
${var:0:9}复制从位置0(文本开头)开始的9个字符。${var:14}会从字符位置14复制到文字结尾。或者,如果是以空格分隔的字段,则需要:
${var:0:9}
${var:14}
read one two three <<< "$var" echo "$one $three" 79.472850 SILENCE
同样,它使用了纯bash。
bvjxkvbb3#
看起来您需要输入中的第一个和第三个 * 字段 *:
$ echo "79.472850 97 SILENCE" | awk '{print $1, $3}' 79.472850 SILENCE
h7appiyu4#
下面是一个awk解决方案,即使在第三列中有空格也能工作:
awk '{$2=""; print}' file
其中,$2=""清空第二列,print输出所有列。
$2=""
print
u4vypkhs5#
如果您希望完全按照sed描述进行提取:
kent$ echo "79.472850 97 SILENCE"|sed -r 's/(^.{9})(.{4})(.*)/\1 \3/' 79.472850 SILENCE
如果您想从空格分隔的输入中提取第一列和第三列/最后一列,您可以使用awk:awk '$2="";7'
awk '$2="";7'
kent$ echo "79.472850 97 SILENCE"|awk '$2="";7' 79.472850 SILENCE
insrf1ej6#
如果要删除/替换的模式是已知的,那么可以使用纯Bash替换它(使用null):
VAR="79.472850 97 SILENCE" echo "${VAR/ 97}" 79.472850 SILENCE
6条答案
按热度按时间rn0zuynd1#
根据您的输入和预期输出,这可以是一种方式:
tr -s " "
删除重复的空格。cut -d" " -f1,3
根据空格分割打印第一个和第三个字段。对于
sed
:kxkpmulp2#
不需要调用
sed
或cut
等外部程序,也不需要调用awk
等其他语言,bash就可以为您做到这一点:${var:0:9}
复制从位置0(文本开头)开始的9个字符。${var:14}
会从字符位置14复制到文字结尾。或者,如果是以空格分隔的字段,则需要:
同样,它使用了纯bash。
bvjxkvbb3#
看起来您需要输入中的第一个和第三个 * 字段 *:
h7appiyu4#
下面是一个awk解决方案,即使在第三列中有空格也能工作:
其中,
$2=""
清空第二列,print
输出所有列。u4vypkhs5#
如果您希望完全按照sed描述进行提取:
如果您想从空格分隔的输入中提取第一列和第三列/最后一列,您可以使用awk:
awk '$2="";7'
insrf1ej6#
如果要删除/替换的模式是已知的,那么可以使用纯Bash替换它(使用null):