1

簡単な質問で申し訳ありませんが、私は4日間勉強してみて盲目になり、正しい構文を打つことができないようです。

cygwinでsedを使用して、1つの印刷不可能なASCII文字を別の1つの印刷不可能な文字に置き換えようとしています。

これが私のソースファイルです。大文字のテキスト[角かっこ内]を使用して、印刷できないASCII文字を示しています。

myfile.txt:

line one[LF]
line two[LF]
line three[LF]
[SUBSTITUTE][LF]
line four{LF]
line five[LF]
line six[LF]
.
.
.

LFをTABに置き換えたいのですが。

LFは16進数の0Aであり、タブは16進数の09なので、基本的に、これを試しました。

sed -i 's/\x0A/\x09/g' myfile.txt

これはファイル内で何も変更しません。

もちろん、私は-b、-e、-rのようなさまざまなスイッチを試しましたが、角かっこあり、なし、/ gあり、なし、余分な円記号と円記号なし、8進数と10進数の表記、エルフのルーン文字まで、絶対に失敗。

ソースとしてファイルの代わりに「echo」を使用したいくつかの回答を読みましたが、混乱して機能しませんでした。

他の例では、実際の単語TABのように「チート」を使用しましたが、数値を使用して構文を学習できなかったため、TABだけでなく他の印刷できない文字にも適用できます。

'file'コマンドを試すと、次のようになります。

file myfile.txt
file.txt: data

だから、もちろん私は試しました:

sed -i -t UTF-8 's/\x0A/\x09/g' myfile.txt

しかし、私のsedはその-tオプションをサポートしていませんでした。

私がこれを試すとき:

oc -c myfile.txt

私が探している[LF]文字は次のように表示されます:

\n

私も検索語として\0Dを試しましたが、運もありません。

誰かが正しい構文を示すことによって私に手がかりを貸したいのであれば、私は非常に感謝するでしょう。

ありがとう。

4

5 に答える 5

2

皆さん、ありがとうございました。助けてくれた人たちに感謝しています。StackOverflowで許可された場合は、支援を試みるたびに賛成票を投じます。

私はそれが他の誰かを助けることを願って私自身の質問に答えています。

sedがLFを処理できないというのは真実ではないことを学びました。それそれらを処理することができますが、それがそれらを書いているときだけです。それらを読むときではありません。

ですから、思った通り、sedで完全に仕事をすることはできませんでした。私はsedのインプレーススイッチが好きです。これは、別のファイルを作成するよりも面倒ではないように見えるため、OCDにアピールします。

私のファイルのフォーマットは:

Mary(LF)
Smith(LF)
(SUB)(LF)
John(LF)
Public(LF)
(SUB)(LF)

そして私は次の結果が欲しかった:

Mary(TAB)Smith(LF)
John(TAB)Public(LF)

そこで、LFをTABに、LF-SUB-LFをLFに変更したいと思いました。

最初にTRを使用してすべてのLFをTABに変更することで、問題を解決しました。これにはsedを使用できませんでした。

# change LFs to TABs ... so grep can later treat entire file as one line
tr '\012' '\011' < comengo.extract.txt > comengo.extract.out
mv comengo.extract.out comengo.extract.txt

このようにして、sedはファイル全体を1行として扱うことができるようになりました。sedはファイルを行ごとに処理するのが好きなので、全体を1行で細かくしました。

2番目のステップは、sedをジャンプさせて、必要な変更を加えることでした。私の質問の要点は、「印刷されていないASCII文字をどのように表現するか」でした。

sed検索文字列で\x12を使用しようとしたため、以前の試行は失敗していました。LFが置き換えられたので、中断のない16進数のシーケンスを使用しました。

# changes (tab)(sub)(tab) to just (sub)
sed -i 's/\x09\x1A\x09/\x1A/g'   comengo.extract.tx

次に、LFを書き込むことができるsedを使用してLFをファイルに復元しました

# (sub) to (tab)(lf)
sed -i 's/\x1A/\x0A\x09/g'  comengo.extract.txt

そして、それは魅力のように機能しました。

于 2013-04-02T01:32:28.270 に答える
1

使用するのはtrどうですか?

tr '\012' '\011' < myfile.txt > tmp.out
mv tmp.out myfile.txt

コマンドはtr純粋なフィルターです。(標準バージョンでは、とにかく)ファイル名の引数を取ったり、上書きや...をサポートしたりしません。

于 2013-03-22T20:37:11.030 に答える
1

sedで改行を指定するポータブルな方法は、エスケープされたリターンを使用することです。

sed -i 's/\
/<tab>/g'

<tab>テキストをリテラルのタブ文字に置き換えます。

于 2013-03-23T02:55:39.010 に答える
1

使用している場合、bashまたはCスタイルのバックスラッシュエスケープをサポートkshするシェルの構文を使用することをお勧めします。$'...'例えば:

[BASH] # echo $'hello\nworld'
hello
world
[BASH] # echo $'hello\x0aworld'
hello
world
[BASH] #
于 2013-03-24T14:11:54.003 に答える
0

実際、-binaryの上に--null-dataを使用すると、sedはLF文字と一致する可能性があります。

$ echo -e "Line1\r\nLine2\rLine3\nLine4\n\rLine5" | sed --null-data --binary -r -e "s/\x0d\x0a/\x0a/g" | od --format=x1a 0000000 4c 69 6e 65 31 0a 4c 69 6e 65 32 0d 4c 69 6e 65 L i n e 1 nl L i n e 2 cr L i n e 0000020 33 0a 4c 69 6e 65 34 0a 0d 4c 69 6e 65 35 0a 3 nl L i n e 4 nl cr L i n e 5 nl

于 2014-09-29T08:38:00.780 に答える