簡體   English   中英

用awk替換行范圍內的所有控制字符

[英]Replace all control characters in a range of line with awk

我有幾行文件。 其中一些行包含LF (0x0A)和CR (0x0D) ,我想將其刪除。 關鍵是,我只想在每行的字符范圍內(例如在File中)用SPACE替換它們:

30 30 30 30 30 30 30 30 30 30 **0D 0A** 30 30 0A; 0000000000..00
30 30 30 30 30 30 30 30 **0D 0A** 30 30 30 30 0A; 00000000..0000

我想從文件的每一行中的位置0到12刪除0d,0a。

我有

awk '{l=substr($0,1,12);r=substr($0,13);gsub(/\x00-\1F/," ",l);print l r}' ${f} > ${f}.noLF

但這似乎不起作用。 我猜substr停在第一個0x0d。
還有其他解決方案嗎?

awk '/\r$/ && length < 13 {sub(/\r$/,""); printf "%s  ", $0; next} {print}' file

這有些丑陋的方法可能起作用!

保存為go

#!/bin/bash
while :
do
    # Read 13 bytes from stdin, and replace carriage returns and linefeeds with spaces
    dd bs=13 count=1 2>/dev/null | tr '\r\n' '  '

    # Break out of loop if dd was not successful
    [ ${PIPESTATUS[0]} -ne 0 ] && break

    # Get rest of conventional line, breaking out of loop if EOF
    read rest || break
    echo $rest
done

它從您的文件中讀取13個字節,並刪除所有回車符和換行符。 然后讀取常規的其余部分並輸出。

像這樣使用它:

chmod +x go
./go < yourfile

例:

more file
q
wertyuiopqwertyuiop
qwerty
uiopqwertyuiop

./go < file
q wertyuiopqwertyuiop
qwerty uiopqwertyuiop

編輯以匹配其他問題

#!/bin/bash
while :
do
    # Read 13 bytes from stdin, and replace carriage returns and linefeeds with spaces
    first13=$(dd bs=13 count=1 2>/dev/null)
    ddexitstatus=$?

    if [ echo $first13 | grep -q "^KT" ]; then
       echo $first13
    else
       echo $first13 | tr '\r\n' '  '
    fi   

    # Break out of loop if dd was not successful
    [ $ddexitstatus -ne 0 ] && break

    # Get rest of conventional line, breaking out of loop if EOF
    read rest || break
    echo $rest
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM