我正在嘗試從文本檔案中洗掉前 N 個字符,重要的是它不是逐行完成的。
目前,我撰寫的這段代碼從每行中洗掉了“i”個字符。但我想從全文中洗掉。
for FILE in *;
do x=$(wc -c < "$FILE"); for ((i=1; i <= $x; i));
do sed "s/^.\{$i\}//" $FILE > $i;
done;
done;
例如,我在 xml/root.xml 目錄中有這個 xml 檔案
<ticket id="usa-001" REFUND="NO" TEST="TEST">
<airline>Us Airlines</airline>
<emptytag id="usa-001" REFUND="NO" TEST="TEST"/>
<preis>30</preis><seat>
<allseats>120</allseats>
</ticket>
我想要的是洗掉前 N 個字符并將其保存到一個新檔案中。讓我們說 5 所以它會是
et id="usa-001" REFUND="NO" TEST="TEST">
<airline>Us Airlines</airline>
<emptytag id="usa-001" REFUND="NO" TEST="TEST"/>
<preis>30</preis><seat>
<allseats>120</allseats>
</ticket>
uj5u.com熱心網友回復:
如果您真的只想過濾掉檔案的前 n 個字符,您需要的工具是dd允許您指定要跳過的塊數。如果您希望塊大小為 1,請使用bs. 例如,要跳過輸入檔案的前 2 個字符,請使用:
$ echo foobarbaz | dd bs=1 skip=2 2> /dev/null
obarbaz
您可以使用 指定輸入檔案if,但重定向可能更簡單。 dd將一堆診斷資訊寫入標準錯誤,并且輸出重定向只是為了抑制這些訊息。這會像泥土一樣慢,因為塊的大小太小了,但是(如果你有一個支持這個的 dd )你可以比使用快得多sed:
dd iflag=skip_bytes skip=5
uj5u.com熱心網友回復:
使用 GNU sed:
$ sed -Ez 's/^.{5}//' root.xml > 5
$ cat 5
et id="usa-001" REFUND="NO" TEST="TEST">
<airline>Us Airlines</airline>
<emptytag id="usa-001" REFUND="NO" TEST="TEST"/>
<preis>30</preis><seat>
<allseats>120</allseats>
</ticket>
如果要在少于 5 個字符的檔案中洗掉最多 5 個字符,請使用{1,5}而不是{5}.
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk代碼。用 GNU 撰寫和測驗awk。
對于單個 Input_file:
awk -i inplace -v RS='^.{5}' -v ORS='' 'END{print}' Input_file
對于使用 GNU的多個 Input_file(s)awk:使用ENDFILE此處的函式將處理每個 Input_file 末尾的所有行,如名稱所示。
awk -i inplace -v RS='^.{5}' -v ORS='' 'ENDFILE{print}' *
uj5u.com熱心網友回復:
您還可以使用tail:
# display from 4th byte
# in other words, remove first 3 bytes
$ printf 'apple\nbanana\nfig\ncherry\n' | tail -c 4
le
banana
fig
cherry
uj5u.com熱心網友回復:
和cut
n=5; cut -c$n- file.txt
看起來您想將每一行保存在一個檔案中。
n=5; cut -c$n- file.txt | awk '{print $0 > NR}'
n=5; cut -c$n- file.txt | awk '{print $0 > NR; exit}'
uj5u.com熱心網友回復:
你知道,你也可以使用hexdump:
hexdump -s 5 -ve '/1 "%c"' inputfile > outfile
uj5u.com熱心網友回復:
你可以做一些像這樣的丑陋和丑陋的事情 -
awk 'BEGIN{ left=100 } { if (left>0) { len=length($0); if (len<left) { left-=len 1; next } else { print substr($0,left); len=0; next } } else print $0 }' infile
不要,請...改用 Ed 的sed。
你可以使用Perl-
perl -e 'seek(STDIN,100,0) && print <>' < infile # simpler
perl -e '$/=undef; open(my $fh,$ARGV[0]); seek($fh,100,0) && print <$fh>' infile # cleaner
但威廉dd在二進制檔案上的作業不需要任何代碼......
dd bs=1 skip=100 < infile > outfile
如果您的版本理解該選項, Sundeep可能最適合文本檔案 -
tail -c 101 infile # start at byte 101, having skipped the first 100
uj5u.com熱心網友回復:
如果你知道它是ASCII:
jot -s '' 27 | gsed -zE 's/.{15}/&\n/g; s/[\n] $/\n/g'
123456789101112
131415161718192
021222324252627
mawk 5 RS='^.....' ORS=
6789101112
131415161718192
021222324252627
假設它是符合標準的UTF-8文本,那么這應該可以預先清理多達 5 個任何型別的 unicode 字符,包括換行符:
printf '%s' "${test_input}" | gnu-wc -lcm
-
?&$?*&?.(?2*?6,?:.?>0?B2?F4?J6?N8?R:?V<?Z>?^@?bB?fD?jF -
0 54 90
mawk2 'BEGIN { FS = "^" (_=(_="([\\000-\\177]|" \ "[\\302-\\364][\\200-\\277] )")(_=(_)_)_ OFS = ORS =__="" _ =_^= RS = "^$" } __!= $(NF *=_==NF )' | gnu-wc -lcm
-
0 49 81
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/517849.html
標籤:Unixawksed字符
