Vom*_*yle 4 sed command-line batch-file
我需要用空白填充文件的最后一行直到位置 80,我还需要确保它总是以没有新行(CR/LF)结束
在Windows 10 上,以下SED用于重新格式化文件,使其CRLF位于每行的第 80 行位置,直到 EOF 并就地更新文件,但最后一行永远不会有CR或LF。
原始文件是一串巨大的可打印字符,在该文件中没有回车或换行符,所以一切都从第一行开始,下面是我用来重新格式化它的SED。
sed -i -e "s/.\{80\}/&\r\n/g" "C:\Folder\test.txt"
Run Code Online (Sandbox Code Playgroud)
我不知道如何让这个文件的最后一行在剩下的地方填充,直到位置 80 有空格并且没有回车。
我已经尝试了一些东西,但我还没有完成,并且不想列出我尝试过的所有东西,所以我展示了我在上面运行的那部分的 sed 语法。我确定我忽略了一些简单的事情,但是。. .
我更愿意为此使用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
Run Code Online (Sandbox Code Playgroud)
我不知道如何用空白空间填充文件中的最后一行,在它的末尾没有 CR 或 LF 到第 80 行。
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--->
Run Code Online (Sandbox Code Playgroud)
警告: 如果您使用上述数据进行测试,请务必将 的文字字符替换[CR][LF]为真正应该代表的内容。
尝试这个:
sed -i -e 's/.\{80\}/&\r\n/g' \
-e 's/$/################################################################################/' \
-e 's/\(\r\n.\{80\}\)#*$/\1/' "C:\Folder\test.txt"
Run Code Online (Sandbox Code Playgroud)
(为了便于演示,我将命令分成多行;您可以在一行中完成所有操作。)s/$/###…###/附加 80 个#字符,然后s/\(\r\n.\{80\}\)#*$/\1/查找此序列:
\r\n#的并将其替换为前两个子弹形成的组。换句话说,它使ñ这是文件的最后一行文字和80- ñ #后面的字符,并丢弃ñ #遵循这些字符。
一旦您确认这有效,只需#将上述命令中出现的所有内容更改为空格。
OP 的最终工作解决方案
注意:该
SET s10=行在等号右侧有 10 个空格。批处理脚本
Run Code Online (Sandbox Code Playgroud)@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
我们可以让这个更容易阅读,并且打字不那么乏味。
如果您的文本都是字母数字,并且某些字符(例如@)永远不会出现在您的数据中,那么您可以执行以下操作:
-e 's/$/@@@@@@@@@@/' \ # Append 10 @ characters to the line.
-e 's/@/ /g' \ # Change each @ to eight spaces.
Run Code Online (Sandbox Code Playgroud)
如果你想让你的脚本清晰易读,但代价是让它变得更冗长,更进一步:
-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.
Run Code Online (Sandbox Code Playgroud)
如果您的数据中没有从未出现过的单个字符,但有一些(短)字符序列,例如(),从未出现过,您可以使用相同的原则:
-e 's/$/()()()()()()()()()()/' \ # Append 10 () pairs to the line.
-e 's/()/ /g' \ # Change each () to eight spaces.
Run Code Online (Sandbox Code Playgroud)
处理正则表达式中的特殊字符时要小心;例如,., *, [, ^, &, 等(并且不要#在脚本中的那些地方包含-comments;要在多行中中断一个简单的命令,\必须是行中的最后一个字符(在换行符之前)而不是在评论中。)
相同的原理:
#!/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"
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
327 次 |
| 最近记录: |