特定の幅でファイル内のテキストを置き換える


0

特定の列位置で交換するにはどうすればよいですか?

例:20〜26列を0に置き換えたい。

から:

12345678123456781234567812345678123456781234567812345678123456781234567812345678    

に:

12345678123456781234000000345678123456781234567812345678123456781234567812345678

これは、このような数万行を含む可能性のあるファイルの各行になります。


任意のエディターがこれを実行できます(20桁目に移動し、6(または7?)文字を削除し、6(または7)回挿入します0)。1つのファイルの多くの行でそれをしようとしていますか?複数のファイルの1つ以上の行について、1回ですか?1つまたは複数のファイルの1つまたは複数の行について、何度も?
ジル

はい、これは数万行を含む可能性のあるテキストファイルの各行に対して行われます。私の元の投稿で明確にされていないことを申し訳ありません。
分割

回答:


0

具体的にはわかりませんが、あなたのために書いただけです。autoitで書かれています。あなたはダウンロードして、以下のコードを使用して、それを自分でコンパイルするか、comiledバージョンをダウンロードすることができ、ここで。変更が必要な場合は、お知らせください。何がで​​きるかを確認します。

編集:ファイルでこれを行う必要がある場合は、私に知らせてください、私はその変更を加えることができます。

編集#2:ファイルを実行するように更新しました(必要な形式はわかりませんでしたが、テキスト/ログファイル以外の操作がどれほど簡単かはわかりません)。範囲外の行を報告します。また、上記のリンクを新しいコンパイル済みバージョンで更新しました。

#include <GuiConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <GuiEdit.au3>
#include <File.au3>

Dim $s_Name = "FileStringReplacer"

Main()

Func Main()
    $h_Parent = GuiCreate($s_Name,400,340)
    GuiCtrlCreateLabel("File to Edit",5,5,90,20)
    $in_File = GuiCtrlCreateInput("",10,25,380,20,$ES_READONLY)
    $bt_Browse = GuiCtrlCreateButton("Find File",10,50,380,25)
    GuiCtrlCreateLabel("Request Status",5,80,90,20)
    $ed_Status = GuiCtrlCreateEdit("",10,100,380,100,$ES_READONLY + $WS_VSCROLL)
    GuiCtrlCreateLabel("Start Point",5,210,50,20)
    $in_Start = GuiCtrlCreateInput("",60,210,25,20)
    GuiCtrlCreateLabel("Stop Point",95,210,50,20)
    $in_Stop = GuiCtrlCreateInput("",150,210,25,20)
    GuiCtrlCreateLabel("Text to Insert",5,240,90,20)
    $in_String = GuiCtrlCreateInput("",10,260,380,20)
    $bt_Replace = GuiCtrlCreateButton("Replace",10,290,380,25)
    GuiSetState()
    Do
        $Msg = GUIGetMsg()

        If $Msg = $bt_Browse Then
            $h_File = FileOpenDialog("File to Modify",@MyDocumentsDir,"Text (*.txt;*.log)", 3)
            GuiCtrlSetData($in_File,$h_File)
        EndIf

        If $Msg = $bt_Replace Then
            GuiCtrlSetData($ed_Status,"")
            If GuiCtrlRead($in_File) <> "" Then
                If IsInt(Int(GuiCtrlRead($in_Start))) and IsInt(Int(GuiCtrlRead($in_Stop))) and Int(GuiCtrlRead($in_Start)) <> 0 and Int(GuiCtrlRead($in_Stop)) <> 0 Then
                    GuiCtrlSetState($bt_Browse,$GUI_DISABLE)
                    GuiCtrlSetState($bt_Replace,$GUI_DISABLE)
                    $h_File = FileOpen(GuiCtrlRead($in_File))
                    $i = 1
                    $s_Line = ""
                    While 1
                        $s_Line = FileReadLine($h_File,$i)
                        If @error Then
                            ExitLoop
                        EndIf
                        If StringLen($s_Line) > GuiCtrlRead($in_Stop) - GuiCtrlRead($in_Start) Then
                        $stringright = StringTrimLeft($s_Line,GuiCtrlRead($in_Stop))
                        $stringleft = StringLeft($s_Line,GuiCtrlRead($in_Start) -1 )
                        $newstring = $stringleft & GuiCtrlRead($in_String) & $stringright
                        _FileWriteToLine(GuiCtrlRead($in_File), $i, $newstring, 1)
                        Else
                            _GUICtrlEdit_AppendText(GuiCtrlGetHandle($ed_Status), @CRLF & "Edit to line " & $i & " failed, specified position is out of range")
                        EndIf
                        $i = $i + 1
                    WEnd
                    FileClose($h_File)
                    GuiCtrlSetState($bt_Browse,$GUI_ENABLE)
                    GuiCtrlSetState($bt_Replace,$GUI_ENABLE)
                Else
                    GuiCtrlSetData($ed_Status,"Error 102" & @CRLF & "Start and stop points must be numbers")
                EndIf
            Else
                GuiCtrlSetData($ed_Status,"Error 101" & @CRLF & "You must specify a file to edit")
            EndIf
        EndIf
        Until $Msg = $GUI_EVENT_CLOSE
    GUIDelete($h_Parent)
EndFunc

変更を加えることができれば、それは素晴らしいことです。これは、数万行を含む可能性のあるテキストファイルの各行に対して行われます。
分割

.txtおよび.logファイルを実行するように更新しました。必要に応じて他の形式を追加できる場合があります。
MaQleod

1

それはどんなテキストエディターでも簡単なはずです。現在の行のgvimでは、コマンドは020lc6l000000<esc>

正規表現を避けたい特別な理由はありますか?


編集

簡単な正規表現を含むステートメントを次に示します。 s/^(.{19}).{6}/${1}000000/

それは検索することを意味します

^      start at the beginning of a line
(      remember stuff found between parentheses
.      any single character
{19}   exactly 19 of them
)      end of the part we want to remember
.{6}   followed by any 6 characters which we won't remember

で置き換えます

${1}   the first set of characters we remembered using () - 19 chars
000000 followed by six zeros (replacing the .{6} we ignore)

通常は次のように記述${1}$1ますが、数字の後に数字が続く場合は、{}を使用して、10番目の記憶部分$ 10と最初の部分$ 1の後にリテラル0を区別する必要があります。

このように使用

perl -pie 's/^(.{19}).{6}/${1}000000/' foo.txt bar.txt any*.txt

任意の数のファイルのすべての行のインプレース編集を行います。ただし、最初にファイルのコピーでテストしてください!


私の特別な理由は、私はそれらが好きではないということです!現実には、私は彼らとあまり経験がなかったので、この時点では自分で1つ書くことはできませんでした。
分割

正規表現は複雑で理解しにくい場合があります。ただし、いくつかの基本的な要素を学習して、シンプルだが便利な方法で使用することもできます。上記の編集された回答の例...
RedGrittyBrick

説明ありがとう。式を使用して各行の特定の位置から開始する方法はありますか?これは固定幅ファイルであり、各行で置換する必要がある文字は同じ位置にあります。
分割

1
^(.{19})効果的に位置20で開始を意味
RedGrittyBrick


0

これを試して:

sed -i 's/^\(.\{19\}\).\{7\}/\10000000/' inputfile

または

sed -ri 's/^(.{19}).{7}/\10000000/' inputfile

回答のおかげで、私はWindows 7を実行していますが
分割

@分割:それはあなたの質問で言及すべきことです。
サーシャチェディゴフ

@divided:GnuWin32UnxUtilssedなど、Windowsシステムで使用できる方法が少なくともいくつかあります。
デニスウィリアムソン

0

Vimはこれを非常に簡単に行うことができます。

Vimでファイルを開き、次を入力します。

:% normal 019l6r0<Enter>



:% normal ファイル内のすべての行で次のコマンドを実行することを意味します。

0 意味:カーソルを行頭に移動します。

19l 意味:カーソルを右に19回移動します

6r0 意味:次の6文字を0に置き換えます


コマンドは最初は少しわかりにくいかもしれません。ただし、必要なことを行うには、いくつかの非常に単純なコマンドを学習するだけです。

0カーソルを行の先頭に
$移動し、カーソルを行の末尾に移動します

hカーソルを左に
j移動カーソルを下に
k移動カーソルを上に
l移動カーソルを右に移動

r カーソルの下の文字を次に押された文字に置き換えます

コマンドを「number」回実行するには、コマンドの前に数字を入力します。

:% normal <list of commands><Enter> ファイル内のすべての行にコマンドのリストを作成します


また、一連の編集を記録してから、ファイルのすべての行で同じ編集を再生することもできます。

コマンドを記録します。

qa<commands>q

次に、ファイルのすべての行でコマンドを再生します。

:% normal @a<Enter>

これは機能しますが、可能であれば別のプログラムのインストールを避けたいと思います。
分割
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.