題 填補最後一行,只有空虛到特定位置


我需要用空白空格填充文件的最後一行,直到位置80,我還需要確保它始終沒有新的結束   線(CR / LF)

信息

Windows 10 下面 SED 用於重新格式化文件以便 CRLF 在每行的第80行,直到EOF並就地更新文件,但最後一行永遠不會有 CR 要么 LF

原始文件是一個巨大的可打印字符串,在此文件中沒有回車符或換行符,所以一切都從第一行開始,下面是 SED 我用它來重新格式化它。

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

我的麻煩

我無法弄清楚如何使這個文件的最後一行在剩下的路上被填充,直到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

期望的結束數據格式

我無法弄清楚如何用空的空格填充文件中的最後一行,其末尾沒有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--->

警告:  如果您使用上述數據進行測試,請務必替換文字字符 [CR][LF] 用那些真正應該代表的東西


4
2017-09-29 02:56


起源


(1)為了澄清,你是說你的輸入文件只是一串巨大的可打印字符,沒有回車符或換行符? (2)如果您的輸入文件是80個字符長的倍數,那麼您顯示的命令將保留它 \r\n 作為最後兩個字符。那個案子你想做什麼?不要管它?添加80個空格?除掉 \r\n?請不要回複評論; 編輯 你的問題,使它更清晰,更完整。 - G-Man


答案:


試試這個:

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的任何性格
  • 任何數量的 #小號
  • 直到緩衝區的末尾

並將其替換為前兩顆子彈形成的組。 換一種說法, 它保持著 ñ 作為文件最後一行的字符 和80-ñ  # 跟隨它的字符, 並丟棄 ñ  # 跟隨這些的人物。

一旦你確認這是有效的, 只是改變所有出現的 # 在上面的命令到空格。


OP的最終工作解決方案

注意: 該 SET s10= line在等號右邊有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.
    

    處理字符時要小心 在正則表達式中很特別;例如。, .*[^&等 (並且不包括 # - 在這些地方的腳本中的評論; 打破多行的簡單命令, 該 \ 必須是該行的最後一個字符(在換行符之前) 而不是評論。)

  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"
    

6
2017-09-29 05:14