特定の列の位置で置き換えるにはどうすればよいですか?
例: 列 20 ~ 26 を 0 に置き換えます。
から:
12345678123456781234567812345678123456781234567812345678123456781234567812345678
に:
12345678123456781234000000345678123456781234567812345678123456781234567812345678
これは、このような行が数万行含まれる可能性があるファイル内の各行に対して行われます。
答え1
具体的なことは知りませんが、あなたのために一つ書きました。オートイット以下のコードを使用して自分でダウンロードしてコンパイルするか、コンパイルされたバージョンをダウンロードすることができます。ここ変更が必要な場合はお知らせください。できる限り対応させていただきます。
編集: ファイルでもこれを行う必要がある場合は、お知らせください。変更いたします。
編集 #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
答え2
これはどんなテキストエディタでも簡単なはずです。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 と、リテラル 0 が続く最初の部分 $1 を区別するために {} を使用する必要があります。
このように使用する
perl -pie 's/^(.{19}).{6}/${1}000000/' foo.txt bar.txt any*.txt
任意の数のファイル内のすべての行をその場で編集します。ただし、まずはファイルのコピーでテストしてください。
答え3
答え4
ヴィムこれは非常に簡単に行うことができます。
Vim でファイルを開き、次のように入力します。
:% normal 019l6r0<Enter>
:% normal
ファイル内のすべての行に対して次のコマンドを実行することを意味します。
0
意味: カーソルを行の先頭に移動します。
19l
意味: カーソルを右に19回移動する
6r0
意味: 次の6文字を0に置き換える
最初はコマンドが少し難解に見えるかもしれませんが、必要なことを実行するには、いくつかの非常に簡単なコマンドを覚えるだけで済みます。
0
カーソルを行頭に移動します
$
カーソルを行末に移動します
h
カーソルを左に動かす
j
カーソルを下に移動
k
カーソルを上に動かす
l
カーソルを右に動かす
r
カーソルの下の文字を次に押された文字に置き換えます
コマンドの前に数字を入力すると、そのコマンドが「数字」回実行されます。
:% normal <list of commands><Enter>
ファイル内の各行のコマンドのリストを作成します
一連の編集を記録して、ファイルのすべての行で同じ編集を再生することもできます。
コマンドを記録します。
qa<commands>q
次に、ファイルの各行でコマンドを再生します。
:% normal @a<Enter>