将最后一行内容填至特定位置

将最后一行内容填至特定位置

我需要用空白填充文件的最后一行直到位置 80,并且我还需要确保它始终以没有新行 (CR/LF) 结束

信息

Windows 10下面独立能源管理委员会用于重新格式化文件,以便CRLF位于每行的第 80 行,直到 EOF 并就地更新文件,但最后一行从来没有CR或者LF

原始文件是一大串可打印字符,文件中没有回车符或换行符,因此所有内容都从第一行开始,下面是独立能源管理委员会我用来重新格式化它。

sed -i -e "s/.\{80\}/&\r\n/g" "C:\Folder\test.txt"

我的烦恼

我无法弄清楚如何让此文件的最后一行直到位置 80 的其余部分都用空格填充并且没有回车符。

我尝试了几种方法,但结果都不太对劲,我不想列出所有我尝试过的方法,所以我展示了上面运行的 sed 语法。我确信我忽略了一些简单的东西,但是……


偏爱

我更愿意使用独立能源管理委员会为此,我必须保持CRLF在最后一行上面的其他行中采用相同的格式,但如果不太复杂的话,我也愿意考虑其他 Windows 解决方案。


注意事项

最后一行的字符可能是 1 个字符、79 个字符,甚至可能是 80 个字符,此时,如果非空白确实填充到最后一行的第 80 行位置,我需要确保最后一行没有回车符或换行符。

虽然屏幕截图包含 91 行,但这些文件可以包含更多行或更少行,但规则始终相同;每行第 80 位置处有回车换行符,最后一行需要正好超过 80 个位置,如果需要则用空格填充,并且无论如何都没有回车符或换行符。


起点数据格式

Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~EOL any legnth and no CR or LF

期望的结束数据格式

我不知道如何用空白填充文件的最后一行,并且行末到第 80 行没有 CR 或 LF。

Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
Data*~123 dummydata Data*~123 dummydata Data*~123 dummydata Data**endoflinedata~[CR][LF]
EOL any legnth less than 80 no CR or LF fill rest empty space to position 80--->

警告: 如果你使用上述数据进行测试,请务必将文字字符替换为[CR][LF]这些真正代表什么

答案1

尝试这个:

sed -i -e 's/.\{80\}/&\r\n/g' \
  -e 's/$/################################################################################/' \
  -e 's/\(\r\n.\{80\}\)#*$/\1/' "C:\Folder\test.txt"

(我将命令分成多行只是为了演示时易于阅读;您可以在一行中完成所有操作。)附加s/$/###…###/80 个#字符,然后s/\(\r\n.\{80\}\)#*$/\1/查找以下序列:

  • \r\n
  • 80 个任意字符
  • #任意数量的
  • 直到缓冲区末尾

并将其替换为前两个项目符号组成的组。换句话说,它保留了n文件的最后一行和第 80 个字符n #紧随其后的字符,并丢弃n #跟随这些字符。

一旦您验证了这有效,只需将#上述命令中的所有出现的更改为空格。


OP 的最终解决方案

笔记:SET s10=行在等号右侧有 10 个空格。

批处理脚本

@ECHO ON

SET File=C:\Folder\test.txt
::: The below s10 variable equals ten white\empty spaces - so it has 10 blank spaces in it
SET s10=          
SET s40=%s10%%s10%%s10%%s10%
SET s80=%s40%%s40%

sed -i -e "s/.\{80\}/&\r\n/g" -e "s/$/%s80%/" -e "s/\(\r\n.\{80\}\)\s*$/\1/" "%File%"
GOTO :EOF

我们可以让它更容易阅读并且减少输入的繁琐。

  1. 纯 sed

    如果您的文本全部由字母数字组成,并且某些字符(例如@)永远不会出现在您的数据中,那么您可以执行以下操作:

      -e 's/$/@@@@@@@@@@/' \        # Append 10 @ characters to the line.
      -e 's/@/        /g' \         # Change each @ to eight spaces.
    

    如果你想让你的脚本清晰易读,但代价是让它变得更冗长,那么可以更进一步:

      -e 's/$/@@@@@@@@@@/' \        # Append 10 @ characters to the line.
      -e 's/@/@@@@@@@@/g' \         # Change each @ to eight @s (there are now 80 @s).
      -e 's/@/ /g'        \         # Change each of the 80 @s to a space.
    

    如果你的数据中没有出现过单个字符,但有一些(短)字符顺序,比如()永远不会出现的,你可以使用同样的原则:

      -e 's/$/()()()()()()()()()()/' \  # Append 10 () pairs to the line.
      -e 's/()/        /g' \            # Change each () to eight spaces.
    

    处理正则表达式中的特殊字符时要小心;例如,.,,,,,,等等*(并且不要在脚本的这些位置包含 -comments;要将简单命令拆分为多行,必须[是该行的最后一个字符(换行符之前),而不是注释中。)^&#\

  2. 使用 shell

    同样的原理:

    #!/bin/sh
    s="          "                  # Set $s to 10 spaces.
    s80="$s$s$s$s$s$s$s$s"          # Set $s80 to 8 copies of $s; i.e., 80 spaces.
    sed -i -e 's/.\{80\}/&\r\n/g' \
      -e 's/$/'"$s80"'/' \
      -e 's/\(\r\n.\{80\}\)\s*$/\1/' "C:\Folder\test.txt"
    

相关内容