在 Bash Unix 中从文本文件中删除前 n 个字符

Ali*_*Ali 3 unix awk sed char

我试图从文本文件中删除前 N 个字符,重要的是它不是逐行完成的。

目前,我编写的这段代码从每行中删除了“i”个字符。但我想从全文中删除。

for FILE in *; 
    do  x=$(wc -c < "$FILE"); for ((i=1; i <= $x; ++i));
            do sed "s/^.\{$i\}//" $FILE > $i; 
        done;
done;
Run Code Online (Sandbox Code Playgroud)

例如我在目录 xml/root.xml 中有这个 xml 文件

<ticket id="usa-001" REFUND="NO" TEST="TEST">
        <airline>Us Airlines</airline>
        <emptytag id="usa-001" REFUND="NO" TEST="TEST"/>
        <preis>30</preis><seat>
            <allseats>120</allseats>
</ticket>
Run Code Online (Sandbox Code Playgroud)

我想要的是删除前 N 个字符并将其保存到新文件中。假设 5 就是这样

et id="usa-001" REFUND="NO" TEST="TEST">
        <airline>Us Airlines</airline>
        <emptytag id="usa-001" REFUND="NO" TEST="TEST"/>
        <preis>30</preis><seat>
            <allseats>120</allseats>
</ticket>
Run Code Online (Sandbox Code Playgroud)

Wil*_*ell 5

如果您确实只想过滤掉文件的前 n 个字符,那么您需要的工具是dd允许您指定要跳过的块数。如果您希望块大小为 1,请使用 指定bs。例如,要跳过输入文件的前 2 个字符,请使用:

$ echo foobarbaz | dd bs=1 skip=2 2> /dev/null
obarbaz
Run Code Online (Sandbox Code Playgroud)

您可以使用 指定输入文件if,但重定向可能更简单。 dd将一堆诊断信息写入 stderr,输出重定向只是为了抑制这些消息。由于块大小太小,这将非常慢,但是(如果您有支持此功能的 dd )您可以比以下方式快得多sed

dd iflag=skip_bytes skip=5
Run Code Online (Sandbox Code Playgroud)