次のように、タブで区切られたデータを含む文字列があります。
h1 h2
a1 b1
a2 b2
私はWindowsでメモ帳を使って作成しました。スペース以外のタブを使用して、タブで区切られたデータを作成しました。
PuTTYを使用してSSH経由でLinuxサーバーに接続します。ファイルを作成し/tmp/test.txt
てタブを保持したいです。だから私は走ったcat <<EOF >/tmp/test.txt
。メモ帳からテキストをコピーしてパテセッションに貼り付けます。それからEOF
。
ただし、これによりタブなしで次の内容のファイルが生成されます。
h1h2
a1b1
a2b2
私はこれがうまくいくことがわかりました。
sed 's/\\t/\t/g' > /tmp/test.txt << EOF
h1\th2
a1\tb1
a2\tb2
EOF
ただし、実際のタブ文字の代わりに「\ t」を使用するように入力文字列を変更する必要があります。 Windowsで文字列リテラルをそのままインポートし、リモートLinuxシステム上のファイルに書き込むことができるよりエレガントでシンプルなソリューションはありますか?
Putty経由でWindowsからSSH経由でLinuxサーバーに接続しています。サーバーは次のとおりです。
- ディストリビューション: Red Hat Enterprise Linux Server バージョン 6.6 (サンディエゴ)
- Bash バージョン: 4.1.2(1)-リリース(x86_64-redhat-linux-gnu)
- 猫:coreutils-8.4-37.0.1.el6.x86_64
答え1
シェルに入力すると、シェルは特定の文字をコマンドとして認識します。たとえば、キャリッジリターン文字(keypressによって送信された文字Enter)は、シェルにコマンドを実行させるようにします。タブ文字はシェルに完了操作を実行させます。 PuTTY端末ウィンドウに何かを貼り付けると、シェルの観点からその文字を入力するのと同じです。したがって、タブ文字を貼り付けると、シェルは完成しますが、タブ文字は挿入しません。
ファイルを変換せずにコピーする最も簡単な方法は、PuTTYの補助プログラムPSCPまたはPSFTPを使用してファイルをコピーすることです。概念的には、これは最も簡単なアプローチですが、他のプログラムの実行、認証、ディレクトリの選択などのオーバーヘッドがあります。
コンテンツをインラインで必要に応じて、ここにcat
直接文書に貼り付けるのではなく、コンテンツに直接貼り付けることができます。次に、シェルの行エディタではなく端末の行エディタに貼り付けます。端末の行エディタは非常にプリミティブなので、タブを除くいくつかの制御文字だけが特別な意味を持ちます。Ctrl入力を終了するには、行の先頭で+を押します。D
[darkstar /]$猫>text.txt Paste Ctrl+D [ダークスター/]$
制御文字を解釈する媒体を介して任意のデータを転送したい場合は、「飼いならされた」文字のみを使用する形式でエンコードできます。Base64制御文字を使用せず、スペースと改行文字を無視します。 GNU coreutils は Linux と Cygwin の基本インストールの一部であり、以下を含みます。base64
注文する。発信者側では、base64 <file-to-decode
以下を実行します。
- Windows:
base64 c:/path/to/test.txt
Cygwin端末で実行 - 出力をコピーします。
- PuTTYウィンドウのシェルで `base64 -d> /tmp/test.txtと入力してを押しますEnter。
- 貼り付けた出力
base64
。 - Ctrl+を押しますD。
答え2
どんな問題があるのかよく分からない。 RHELインストールでcat
タップ停止を行うと機能します。ただし、より一般的な解決策は次のとおりです。
#!/usr/bin/perl
use strict;
use warnings;
while ( <> ) {
s/\s+/\t/g;
print;
}
STDIN
「入力」(挿入)またはファイル名(例:)を受け入れ、myscript.pl <filename>
すべてのスペースをタブストップに変換します。
答え3
それよりも簡単な解決策が必要な場合は、perl script
sedを使用できます。perl script
とにかくとても簡単です。
echo "hello world" | sed 's/\(\t\+\)/\t/g'
とにかくredhat 5
catコマンドを使用することに問題はありません。
rpm -qf $(which cat)
coreutils-5.97-34.el5
答え4
Bashマニュアルの説明(パート1 [n]<<[-]word
):
単語の一部が引用されている場合、区切り文字は単語から引用符を削除した結果であり、文書の行はここでは拡張されません。単語が引用されていない場合は、ここのドキュメントのすべての行にパラメータ拡張、コマンド置換、および算術拡張があります。
cat >/tmp/test.txt <<'EOF'
そうかもしれませんが、いいえ:TABは引き続き拡張中です。 readlineライブラリのようなので、簡単な解決策があります:
user@host:~> bash --noediting
user@host:~> cat >/tmp/test.txt <<EOF
(今すぐデータを貼り付けてください)
EOF
user@jhost:~> exit
(余分な皮を残してください)
WindowsとSSHサポートUNIX間でファイルを交換するもう1つのツールは次のとおりです。WinSCP。