質問: 区切り文字の位置に基づいて区切り文字内を置き換えるunixコマンド | [パイプ]区切り文字を含む入力文字列があり、空の文字列の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 loopを使用してファイルを読み取り、cutコマンドを使用する別のソリューションがあります。区切り文字を使用して、位置に基づいて変数に格納し、sedを使用してスペースを「&」で置き換え、分割されたすべての変数を1つの変数に追加し、新しいファイルに追加します。これを達成するために使用できる単一のコマンドはありますか?
回答: あなたができる_sed 's/\(|[^| ]*\) */\1\&/4;s//\1\&/2' _あなたの例のために。説明:_|[^| ]*_は、フィールド区切り文字とその列のすべての非スペースを検索します。 \(\)でグループ化されているので、後で_\1_に置き換えてコピーできます。次に、1つ以上の空白が_&_に置き換えられます。これは、置換文字列でエスケープする必要があります。 _4_は、これを5番目の列である4番目のオカレンスに適用することを意味します。次に、3番目の列を_2_で繰り返します。空のパターンを指定してパターンを繰り返す必要はありません。列にスペースのグループが複数あるか、まったくない場合は、さらに複雑になります。次に、awkなどの別のツールを使用することをお勧めします。一方、各列に常に空白が1つあることがわかっている場合は、単純な_sed 's/ /\&/5;s//\&/3' _