<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>テキスト処理 on Marketechlabo</title><link>https://www.marketechlabo.com/tags/text-processing/</link><description>Recent content in テキスト処理 on Marketechlabo</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Tue, 09 Apr 2019 00:00:00 +0900</lastBuildDate><atom:link href="https://www.marketechlabo.com/tags/text-processing/index.xml" rel="self" type="application/rss+xml"/><item><title>linuxのテキスト編集（vi, sed, tr, grepなど＋xargs）まとめ</title><link>https://www.marketechlabo.com/server-infrastructure/linux-commands-text-processing/</link><pubDate>Tue, 09 Apr 2019 00:00:00 +0900</pubDate><guid>https://www.marketechlabo.com/server-infrastructure/linux-commands-text-processing/</guid><description>
&lt;p&gt;linuxなどで使うテキスト編集コマンドの使い方で、これさえ知っていればOKというもののまとめ（vi, sed, grep, sort, uniq, cut, join, tr, iconv, diff）。
後半は特に必要とはいえないため適当。重要なのはvi, sed, grepまでかな。
複数のファイルを扱う場合に使うxargsコマンドについても説明する。
テキスト検索にはripgrep（&lt;code&gt;rg&lt;/code&gt;）やfzfなどのモダンなツールもあるが、本記事では基本的なコマンドに絞る。&lt;/p&gt;
&lt;h2 id="vi"&gt;vi&lt;/h2&gt;
&lt;p&gt;※（数指定）のついているものは、コマンドの前に数を指定することで指定された数だけ該当する操作を行える。
（&lt;code&gt;6h&lt;/code&gt;で6字分左に移動）&lt;/p&gt;
&lt;h3 id="コマンドモードと入力モード"&gt;コマンドモードと入力モード&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;コマンドモード→入力モード
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;i&lt;/code&gt;: カーソルの直前に挿入（insert）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;I&lt;/code&gt;: カーソル行の最初に挿入&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a&lt;/code&gt;: カーソルの直後に挿入（add）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;A&lt;/code&gt;: カーソル行の最後に挿入&lt;/li&gt;
&lt;li&gt;&lt;code&gt;o&lt;/code&gt;: カーソルの下の行に挿入&lt;/li&gt;
&lt;li&gt;&lt;code&gt;O&lt;/code&gt;: カーソルの上の行に挿入&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入力モード→コマンドモード: &lt;code&gt;ESC&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="移動"&gt;移動&lt;/h3&gt;
&lt;p&gt;（ちょうど右手のホームポジション）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;h&lt;/code&gt;: 左（数指定）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;j&lt;/code&gt;: 下（数指定）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;k&lt;/code&gt;: 上（数指定）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;l&lt;/code&gt;: 右（数指定）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;（ページ移動）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl-b&lt;/code&gt;: PgUp（back）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl-f&lt;/code&gt;: PgDn（forward）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;（行内）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;^&lt;/code&gt;: 行頭（正規表現）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$&lt;/code&gt;: 行末（正規表現）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;（行指定）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl-g&lt;/code&gt;: 現在の行表示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;G&lt;/code&gt;: 最終行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;数字G&lt;/code&gt;: 指定行に移動&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="コピーカットペースト"&gt;コピー、カット、ペースト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt;: 文字削除（数指定）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dw&lt;/code&gt;: 単語削除（数指定）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yw&lt;/code&gt;: 単語コピー（数指定）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dd&lt;/code&gt;: 行削除（数指定）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yy&lt;/code&gt;: 行コピー（数指定）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;p&lt;/code&gt;: カーソルの下に貼り付け&lt;/li&gt;
&lt;li&gt;&lt;code&gt;P&lt;/code&gt;: カーソル行に貼り付け&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s&lt;/code&gt;: カーソル位置の文字を修正、上書き（数指定）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl-h&lt;/code&gt;: Back Space&lt;/li&gt;
&lt;li&gt;&lt;code&gt;J&lt;/code&gt;: カーソル行と次行を連結する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="undoredo"&gt;undo,redo&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;u&lt;/code&gt;: 直前の作業の取り消し&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt;: 直前の作業の繰り返し&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="検索置換"&gt;検索、置換&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:/文字列&lt;/code&gt;: 文字列の検索（/.はエスケープが必要）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;n&lt;/code&gt;: 下方向への検索&lt;/li&gt;
&lt;li&gt;&lt;code&gt;N&lt;/code&gt;: 上方向への検索&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:%s/文字列1/文字列2/g&lt;/code&gt;: ファイル内の文字列1を文字列2に置換（全箇所）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="便利なコマンド"&gt;便利なコマンド&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:!コマンド&lt;/code&gt;: ローカルコマンド実行&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="設定"&gt;設定&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;.swpファイルを生成しない。
&lt;code&gt;:set noswapfile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;.swpファイルを生成する。
&lt;code&gt;:set swapfile&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ファイルを開く"&gt;ファイルを開く&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:e ../toedit.txt&lt;/code&gt;: 指定したパスのファイルを開く&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="保存終了"&gt;保存、終了&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:w!&lt;/code&gt;: 保存&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:q!&lt;/code&gt;: 終了&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:wq!&lt;/code&gt;: 保存して終了&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:w ファイル名&lt;/code&gt;: ファイル名として保存&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sed"&gt;sed&lt;/h2&gt;
&lt;p&gt;行や文字列の置換、削除、抽出を行うコマンド&lt;/p&gt;</description></item><item><title>Perlのよく使うワンライナー（テキスト処理）</title><link>https://www.marketechlabo.com/server-infrastructure/perl-one-liner/</link><pubDate>Fri, 05 Apr 2019 00:00:00 +0900</pubDate><guid>https://www.marketechlabo.com/server-infrastructure/perl-one-liner/</guid><description>
&lt;p&gt;Perlのワンライナー。
&lt;code&gt;sed&lt;/code&gt;や&lt;code&gt;awk&lt;/code&gt;では扱いにくい、複雑な条件分岐や変換が必要なテキスト加工（CSVファイル処理など）に適している。UTF-8が標準化した現在では文字コード変換のニーズは減っているが、複雑な正規表現やPerlの組み込み機能を活用できる場面では有用である。
いろいろオプションはあるのだが、最小限に絞って備忘録的に。&lt;/p&gt;
&lt;h2 id="よく使うオプション"&gt;よく使うオプション&lt;/h2&gt;
&lt;h3 id="基本"&gt;基本&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-e 'スクリプト'&lt;/code&gt;： 実行するPerlスクリプトを指定（1行）&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;perl &lt;span style="color:#f92672"&gt;-&lt;/span&gt;e &lt;span style="color:#e6db74"&gt;&amp;#39;print &amp;#34;Hello&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hello
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="入力が前提"&gt;入力が前提&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-l&lt;/code&gt;：（入力から改行を取り除いたうえで最後に）出力結果を改行する。表示制御の目的で使われることが多い。データ加工の際は使わないほうが安全（使うとしても最後の処理として）。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;perl &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#f92672"&gt;le&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;print &amp;#34;Hello&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hello
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-n&lt;/code&gt;：ファイルを読み込んで1行ずつ（whileで）処理する。行の内容は特殊変数&lt;code&gt;$_&lt;/code&gt;に格納される。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;perl &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#f92672"&gt;ne&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;func&amp;#39;&lt;/span&gt; file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;は&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;perl &lt;span style="color:#f92672"&gt;-&lt;/span&gt;e &lt;span style="color:#e6db74"&gt;&amp;#39;open(FILE, &amp;#34;&amp;lt; file&amp;#34;); while(&amp;lt;FILE&amp;gt;) { func($_); }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;と同じことになる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;perl &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#f92672"&gt;ne&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;print $.&amp;#34;: &amp;#34;.$_&amp;#39;&lt;/span&gt; rand&lt;span style="color:#f92672"&gt;.&lt;/span&gt;txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;53&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;45&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt;：&lt;code&gt;-n&lt;/code&gt;に加えて結果の&lt;code&gt;$_&lt;/code&gt;を&lt;code&gt;print&lt;/code&gt;する。&lt;code&gt;sed -e&lt;/code&gt;みたいなことをするときに使う。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;perl -pe &amp;#39;s/[0-3]/A/g&amp;#39; rand.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AA
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;A
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;45&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-0777&lt;/code&gt;：入力を行ごとに区切らない。&lt;code&gt;-p&lt;/code&gt;や&lt;code&gt;-e&lt;/code&gt;と同時に用いられる。行ごとに変わるはずのない文字コード判別などの際に使う。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;perl &lt;span style="color:#f92672"&gt;-&lt;/span&gt;MEncode::Guess &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0777&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#f92672"&gt;ne&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;print guess_encoding($_, qw/shiftjis eucjp utf8/)-&amp;gt;name&amp;#39;&lt;/span&gt; multibyte&lt;span style="color:#f92672"&gt;.&lt;/span&gt;txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;utf8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-i　ファイル名&lt;/code&gt;：ファイルの上書き&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-i拡張子 ファイル名&lt;/code&gt;：ファイルの上書き＆拡張子付きのバックアップファイル生成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;-i&lt;/code&gt;オプションは&lt;strong&gt;末尾（スクリプトの後）に記述する&lt;/strong&gt;こと。それ以外の位置だとマルチバイト文字を含む場合などうまくいかないことがある。&lt;/p&gt;</description></item></channel></rss>