1. 概要

Linuxコマンドラインで作業するときの一般的なタスクは、文字列またはパターンを検索してから、それを置換または削除することです。 ただし、この一般的なタスクが予想よりも簡単ではなくなる可能性のある特殊文字があります。

このチュートリアルでは、 tr awk Perl などのツールを使用して改行文字を削除するいくつかのアプローチについて説明します。 ] past 、 sed 、Bash、およびVimエディター。

2. サンプルファイルの準備

始める前に、すべての戦略を適用するために使用するsome_names.txtという名前のテキストファイルを作成しましょう。

$ cat > some_names.txt << _eof_
Martha,
Charlotte,
Diego,
William,
_eof_

目標は、次の内容のCSVのようなファイルを作成することです。

Martha,Charlotte,Diego,William,

3. trを使用する

一部の文字を削除したり、特定の文字に置き換えたりするために、trは使いやすいと考えています。

コマンド tr 標準入力を使用します(stdin)、いくつかの操作(変換、スクイーズ、削除)を実行してから、結果を標準出力にコピーします(stdout).

ここでは、「削除」操作に焦点を当てます。 パラメータ-dを使用して、trで削除する文字のセットを定義します。

改行を削除したいだけなので、この文字だけをセットに配置してから、標準出力を新しいCSVファイルにリダイレクトします。

$ tr -d "\n" < some_names.txt > some_names.csv

それでは、CSVファイルの内容を見てみましょう。

$ cat some_names.txt
Martha,Charlotte,Diego,William,

4. awkを使用する

The awk プログラムは、よく知られた強力で便利なツールであり、 パターンとアクション。

これにより、いくつかのトリックを使用して、非常に簡単な方法でいくつかの操作を実行できます。

$ awk 1 ORS='' some_names.txt > some_names.csv

CSVファイルの内容を見てみましょう。

$ cat some_names.csv
Martha,Charlotte,Diego,William,

問題をどのように解決したかを詳しく見てみましょう。

パターン「1」を書いたのは、それが true (レコードの処理を可能にする)と評価され、アクションがない場合に、 awk デフォルトのアクションを実行します。これは、の値で終了したレコード全体を印刷することです。 ORS 変数。

次に、 ORS (出力レコード区切り文字)変数を定義します。これはデフォルトで改行に設定されており、空の文字列になります。

これらの2つの手順に従って、すべてのレコードを消費し、空の文字列を出力レコードセパレータとして使用してそれらを印刷しました。 つまり、改行を単に無視しました。

もう1つの方法は、awkプログラムテキストとして使用することです。

$ awk 'ORS="";1' some_names.txt

そして、その拡張バージョンはになります

$ awk 'BEGIN{ ORS="" } { print $0 }' some_names.txt

ここでも同じことをしますが、今回は BEGINパターンを使用します。これは、入力のいずれかが読み取られる前に ORS 変数を定義するアクションを実行し、次に印刷します。 $ 0 変数。これには、レコード全体(通常は入力の行全体)が含まれます。

5. Perlの使用

Perl は、テキスト処理のための優れた機能セットを備えた言語です。

Perlインタープリターをsedのような方法で使用します。

$ perl -pe 's/\n//' some_names.txt > some_names.csv

このコマンドがどのように機能するかを見てみましょう。

  • -p プログラムの周りに次のループを想定するようにPerlに指示します
  • -e 次の文字列を1行のスクリプトとして使用するようにPerlに指示します
  • ‘s / \ n //’ Perlに削除するように指示するスクリプトです \ n キャラクター

それでは、CSVファイルを確認しましょう。

$ cat some_names.csv
Martha,Charlotte,Diego,William,

6. 貼り付けを使用する

past プログラムは、ファイルの行をマージするユーティリティですが、改行を削除するためにも使用できます。

次のワンライナーで試してみましょう:

$ paste -sd "" some_names.txt > some_names.csv 

それでは、CSVファイルを確認してみましょう。

$ cat some_names.csv
Martha,Charlotte,Diego,William,

これを実現できるのは、pastにパラメータ-sがあり、各ファイルを1行ずつ残して、一度に1つのファイルを貼り付けます。 -d 、これにより、空の文字列を区切り文字として定義できます。

これらの2つの貼り付けオプションを使用すると、改行に言及することなく、必要なものを取得できます。

7. sedを使用する

テキストの処理について話すとき、問題に関係なく、通常sedストリームエディターが思い浮かびます。

スクリプトの/ /置換/’ で一般的に使用されます sed

これを使用して行末を置き換え、何が起こるかを見てみましょう。

$ sed 's/\n//g' some_names.txt
Martha,
Charlotte,
Diego,
William,

また、 sedは一度に1行を読み取るため、変更はありません。その後、改行はパターンスペースに配置される前に常に削除されます。

この新しいワンライナーを試してみましょう。

$ sed ':label1 ; N ; $! b label1 ; s/\n//g' some_names.txt > some_names.csv

次に、CSVファイルの内容を見てみましょう。

$ cat some_names.csv
Martha,Charlotte,Diego,William,

これで、必要なものができました。

スクリプトの各セクション(セミコロンで区切られている)を分解して、スクリプトがどのように機能するかを理解しましょう。

  • :label1 は、label1という名前のラベルを作成します
  • N は、sedに次の行をパターンスペースに追加するように指示します
  • $! bラベル1 言う sed 私たちのラベルを分岐(移動)する label1 最後の行でない場合
  • s / \ n // g は、パターンスペースにあるものから \n文字を削除します

つまり、これらすべての要素を組み合わせて、sedが入力の最後の行にあるときに終了するループを構築します。

8. Bashコマンドラインスクリプトの使用

Bash はほとんどのLinuxディストリビューションにインストールされているので、それを使用して必要なものを取得することができます。

使用できるオプションの1つは、whileループです。

$ while read row
do 
    printf "$row"
done < some_names.txt > some_names.csv

ここでは、 while ループで、Bashに組み込まれている read を使用して、ファイル some_names.txt のコンテンツを読み取り、次に各行を変数rowに割り当てます。

その後、組み込みの printf は、改行なしでその行を印刷します。 最後に、出力をCSVファイルにリダイレクトします。

readarray 組み込み、 IFS 変数、およびパラメーター拡張メカニズムを使用して、同じことを実現できます。

$ OLDIFS=$IFS ; IFS='' ; readarray -t file_array < some_names.txt ; echo "${file_array[*]}" > some_names.csv ; IFS=$OLDIFS

Bashにはトリックがたくさんあり、ここではそれらのいくつかを使用しています。 セクションごとに理解しましょう:

  • OLDIFS = $ IFS :現在の変数IFSOLDIFS変数に保存します。
  • IFS =” IFSを空の文字列に定義します
  • readarray -t file_array を使用して、配列file_arraysome_names.txtのコンテンツを割り当てます。各行から改行を削除するファイル
  • “ $ {file_array [*]}” を使用すると、Bashは配列 file_array の各値を、IFS変数の最初の文字で区切って展開します。
  • 最後に、IFS変数を復元します

ただし、サブシェルを使用すると、少し注意が必要になる場合があります。

$ (
readarray -t file_array < some_names.txt;
IFS='';
echo "${file_array[*]}" > some_names.csv;
)

これは、サブシェル内の変数がサブシェルの外部に表示されないという事実のおかげで、現在のIFS変数を安全に保ちながら同等です。

IFS変数は特別です Bashのデフォルト値 IFS 変数は 、または” \ t \ n”。

最後に、CSVファイルの内容を見てみましょう。

$ cat some_names.csv
Martha,Charlotte,Diego,William,

9. Vimエディターの使用

Linuxには多くのエディターフレーバーがありますが、最も有名なものの1つに焦点を当てましょう。

Vim (ViImproved)は多くの便利なユーティリティを備えたエディタです。

サンプルファイルをVimエディターで開きましょう。

$ vim some_names.txt
Martha,
Charlotte,
Diego,
William,

次に、コマンド %s / \ n // を記述して、CSVファイルに保存しましょう。

現在、次のようなものがあります。

Martha,Charlotte,Diego,William,

それでは、コンテンツをsome_names.csvというファイルに保存しましょう。

このセクションを終了するために、何が起こったのかを理解しましょう。 コマンドs/ \ n // を使用して、すべての \n文字を削除します。 そして、記号を使用すると、Vimはこれをファイルのすべての行に適用します。

10. 結論

改行を削除すると、一般的な文字を削除する戦略以外の戦略について考えるようになります。 この記事では、 tr awk Perl past などのコマンドを使用してこれらの戦略のいくつかを確認しました。 sed 、Bash、およびVimエディター。