コマンドを実行すると、cat file | grep pattern
何行もの出力が得られます。すべての行を1行に連結して、各行"\n"
を"\" "
(末尾に"
スペースが続く)で効果的に置き換えるにはどうすればよいですか?
cat file | grep pattern | xargs sed s/\n/ /g
私のために働いていません。
コマンドを実行すると、cat file | grep pattern
何行もの出力が得られます。すべての行を1行に連結して、各行"\n"
を"\" "
(末尾に"
スペースが続く)で効果的に置き換えるにはどうすればよいですか?
cat file | grep pattern | xargs sed s/\n/ /g
私のために働いていません。
回答:
tr '\n' ' '
すべての改行文字をスペースに変換するために使用します:
$ grep pattern file | tr '\n' ' '
注:grep
ファイルを読み取り、ファイルをcat
連結します。やめろcat file | grep
!
編集:
tr
単一文字の翻訳のみを処理できます。次のawk
ようにして、出力レコードセパレータを変更できます。
$ grep pattern file | awk '{print}' ORS='" '
これは変換します:
one
two
three
に:
one" two" three"
echo ""
プロンプトテキストの前に新しい行を追加するには、最後に追加する必要があります。
"
ように表示されますが、のように表示しone" two" three"
たいですone" two" three
。最後の3つには括弧がないことに注意してください。何か案は?
sed '$s/..$//'
して、最終行の最後の2文字を削除できます。
--delete
場合は、デフォルトで2つの引数が想定されるため、このオプションを使用する必要があります。例えばtr --delete '\n'
。
出力をパイピングするxargs
と、出力の各行がスペースを含む1行に連結されます。
grep pattern file | xargs
または、任意のコマンド。ls | xargs
。xargs
出力のデフォルトの制限は〜4096文字ですが、たとえば、xargs -s 8192
。
| tr '\n' ' '
php exec
関数を介して呼び出されたときに私のために働いていませんでした。それはtrを無視し、grepからの最後の一致を与えていました。| xargs
働いた。
echo
引用符なしのbash では、キャリッジリターン、タブ、および複数のスペースを削除します
echo $(cat file)
IFS="$(printf '\n\t')"
echo $(<file)
...エコーを使用することは、を使用するtr '\n' ' '
よりも優れているだけでなく、より優れています(\r\n
行末を考える)。@aggsol言うことができますIFS=$'\n\t'
改行文字 \n
をスペースで置き換えたい場合:
xargs < file
xargs
1行あたりの文字数とすべての文字の合計数には独自の制限がありますが、増やすことができます。詳細は、次のコマンドを実行することで確認できます。xargs --show-limits
もちろん、マニュアルでも確認できます。man xargs
ある文字を別の文字に正確に置き換える場合:
tr '\n' ' ' < file
1つの文字を多くの文字に置き換えたい場合:
tr '\n' '~' < file | sed s/~/many_characters/g
まず、我々は、改行文字を置換\n
チルダために~
(またはテキストに存在しない別のユニークなキャラクターを選択)した後、我々は(他の文字とのチルダ文字を置き換えるmany_characters
)、我々は、各チルダ(フラグのためにそれを行いますg
)。
おそらくそれを行うための最良の方法は、出力を1行に生成する「awk」ツールを使用することです
$ awk ' /pattern/ {print}' ORS=' ' /path/to/file
すべての行をスペース区切り文字で1つにマージします
{print}
はデフォルトのawkアクションなので必要ありません。
sed
Bashがスクリプトを混乱させないように、スクリプトを単一引用符で囲む必要があります(2つの引数を使用したsed s/\n/ /g
呼び出しsed
、つまりs/n/
と/g
)。(2)あなたはの出力が欲しいので、cat file | grep pattern
する入力にsed
ない、引数にsed
、あなたは排除する必要がありますxargs
。(3)2番目の引数としてファイル名を取ることができるため、cat
ここでは必要ありませんgrep
。だから、試してみるべきだったgrep pattern file | sed 's/\n/ /g'
。(この場合、上記のリンクに示されている理由により、機能しませんでしたが、今、あなたは将来のために知っています。)