我需要用空白填充文件的最后一行直到位置 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
我们可以让它更容易阅读并且减少输入的繁琐。
纯 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;要将简单命令拆分为多行,必须[
是该行的最后一个字符(换行符之前),而不是注释中。)^
&
#
\
使用 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"