[パイプ]区切り文字がある入力文字列があり、3番目と5番目の列の空の文字列を文字ごとに変更したいと|
思います。&
入力ファイル:
a a|b b|c c|d d|e e
f f|g g|h h|i i|j j
結果ファイル:
a a|b b|c&c|d d|e&e
f f|g g|h&h|i i|j&j
cc, ee, hh and jj
間のスペースが次のように置き換えられていることがわかります。以下を&
使用してファイルを読み取る代替ソリューションがあります。whileループ次に、区切り文字ベースのコマンドを使用してcut
位置ベースの変数に保存し、スペースを「&」に置き換え、sed
すべての区切り変数を1つの変数に追加し、新しいファイルに追加します。これを達成するために使用できるコマンドはありますか?
答え1
これに使用されますawk
。
awk -F\| '{gsub(" ","\\&",$3); gsub(" ","\\&",$5)}1' OFS=\| infile.txt
、 "awk"にフィールドが
-F\|
パイプで区切られていることを伝えます(シェルによってエスケープされるので、次|
のように解釈しないでください)。\
pipeline stdin
-F"|"
、または)を使用できます-F'|'
。これ
gsub("regexp","replacement"[, INDEX])
" "
(スペース)を&
インデックス(列)のテキストに置き換える構文は、区切り文字に基づいて各インデックス位置について以下に示されています$3
。$5
|
a a|b b|c c|d d|e e ^^^|^^^|^^^|^^^|^^^ $1 |$2 |$3 |$4 |$5
詳しくはこちらなぜ我々は
\\&
そこから2回脱出したのですか? !1
最後に何を使用しますかawk '{...}1'
?これは awk の基本的な印刷ジョブ制御です。詳細を読むもう一度戻る
OFS=\|
か、指定された区切り文字を含むフィールドを印刷します|
。
答え2
あなたはできます
sed 's/\(|[^| ]*\) */\1\&/4;s//\1\&/2'
たとえば、見てみましょう。説明する:
|[^| ]*
列でフィールド区切り文字と空白以外のすべての文字を検索します。\(\)
後で代替アイテムにコピーできるようにグループ化されています\1
。これにより、1つ以上のスペースが置き換えられ、&
代替文字列からエスケープする必要があります。4
この方法を4番目の項目(つまり5番目の列)に適用します。次に、2
3番目の列に対してこれを繰り返します。空のパターンを提供してパターンを繰り返す必要はありません。
列に複数の空白がある場合、または空白がまったくない場合、状況はさらに複雑になります。その場合は、他のツールを使用することをお勧めしますawk
。
一方、各列に常にスペースがあることがわかっている場合は、簡単な作業を実行してください。
sed 's/ /\&/5;s//\&/3'
答え3
perl -aF'(\|)' -lne 's/\h/&/ for @F[2*2,2*4]; print @F' input_file
結果
a a|b b|c&c|d d|e&e
f f|g g|h&h|i i|j&j
布材
パイプの現在のレコードを分割し|
、フィールドに区切り文字を含めます。したがって、3番目と5番目のゲームは2 * 2、2 * 4ゲームになります。
\h
両方のフィールドで水平スペースを text に置き換えます&
。完了したら、フィールドを印刷します。