Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux cut命令-在多个位置之间捕获字符串_Linux_Sed_Cut - Fatal编程技术网

Linux cut命令-在多个位置之间捕获字符串

Linux cut命令-在多个位置之间捕获字符串,linux,sed,cut,Linux,Sed,Cut,我有一个包含很长行的文本文件。我只想通过指定几个位置来获取文件的一部分 我尝试了cut,但它似乎与我所需要的正好相反;它只捕获我不想要的东西 我的剪切代码: /bin/cat file.txt | /usr/bin/cut -f50-62,3414-5706427 我的预期结果是,除了字符50-62和字符3414-5706427之外,整个文件都是 我也考虑过sed,但没有办法让sed只提供我需要的数据。是否有任何Linux命令可以反转结果?如果需要特定的字符,请使用-c -f用于使用-d指定字

我有一个包含很长行的文本文件。我只想通过指定几个位置来获取文件的一部分

我尝试了
cut
,但它似乎与我所需要的正好相反;它只捕获我不想要的东西

我的剪切代码:

/bin/cat file.txt | /usr/bin/cut -f50-62,3414-5706427
我的预期结果是,除了字符50-62和字符3414-5706427之外,整个文件都是

我也考虑过
sed
,但没有办法让
sed
只提供我需要的数据。是否有任何Linux命令可以反转结果?

如果需要特定的字符,请使用
-c

-f
用于使用
-d
指定字段分隔符的字段

sed
将为您完成这项工作:(我的算术可能有点错误)


编辑:有一个
cut
选项,看起来像是做了你想要的:

echo "abcdefghikjl" | cut -c2-4
bcd
echo "abcdefghikjl" | cut -c2-4 --complement
aefghikjl
否则,您可以使用本机bash:

用法:

revcut "some string" start end
从文件中:

revcut "$(cat filename)" start end

不完全清楚您的位置是整个文件中的字节位置,还是具有很长行的文件中的列位置(3KB的行是不常见的,更不用说5MB了)

但是,您可以使用
cut
处理选择长线信息的问题:

cut -c 1-49,63-3413,5706428-    # character positions in each line
cut -c 1-49,63-3413,5706428-    # byte positions in each line
如果使用UTF-8作为代码集(并且文件中的任何字符都不在UTF-8的ASCII子集中),则字节和字符之间的差异很重要

如果您处理的是文件中的位置,那么您的选项将更加有限。大多数Unix实用程序都基于行而不是其他任何东西。一个笨拙的选项是
dd
命令:

{
dd if=file bs=1 offset=0       count=49             # 1-49
dd if=file bs=1 offset=63      count=$((3414-63))   # 63-3413
dd if=file bs=1 offset=5706428                      # 5706428-EOF
} > output

您可能需要调整数字以补偿基于0和基于1的算术。

谢谢glenn,-c确实有意义,但我问题的主要部分是如何获得不在指定范围内的值。
cut -c 1-49,63-3413,5706428-    # character positions in each line
cut -c 1-49,63-3413,5706428-    # byte positions in each line
{
dd if=file bs=1 offset=0       count=49             # 1-49
dd if=file bs=1 offset=63      count=$((3414-63))   # 63-3413
dd if=file bs=1 offset=5706428                      # 5706428-EOF
} > output