![最初の列のテキストにのみ作業しますか? [コピー]](https://linux33.com/image/143379/%E6%9C%80%E5%88%9D%E3%81%AE%E5%88%97%E3%81%AE%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AB%E3%81%AE%E3%81%BF%E4%BD%9C%E6%A5%AD%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
入力例:
[email protected] [email protected],[email protected]
出力例:
[email protected] [email protected],[email protected]
したがって、「通常の」状況では、次のことが明らかに簡単です。
sed 's/.com/.org/g'
しかし、明らかに、この場合は、最初の列のサフィックスにのみ作業したいと思いますが、2番目の列は変更されずに維持されることを望みます。
私はあなたがどんなツールを提案しても構いません。しかし、私は追加のインストールなしで標準のLinuxで利用できることを好みます(つまり、またはsed
同じawk
ことがperl
望ましいでしょうbobsobscuretoolthatneedsinstalling
)。
答え1
.com
の最初の項目だけに置き換えるには、.org
sed演算子のデフォルトの動作だけが必要ですs///
。そのフラグを使用しないでくださいg
。
$ sed 's/.com/.org/' file
[email protected] [email protected],[email protected]
最初のカンマで定義されたフィールドのみを変更して、最初のフィールドが行の.com
別の場所に表示されても変更されていないままにしたい場合は、次のようにします。
$ perl -pe 's/^(\S+)\.com/$1.org/' file
[email protected] [email protected],[email protected]
または、部分文字列として表示される場合com
(たとえば)、foo.common.net
より安全です。
$ perl -pe 's/^(\S+)\.com\b/$1.org/' file
[email protected] [email protected],[email protected]
またはGNU sedから:
$ sed -E 's/^(\S+)\.com\b/\1.org/' file
[email protected] [email protected],[email protected]
または移植可能(最初のフィールドが最初のフィールドによって定義されていると仮定)スペースタブまたは他のスペースの代わりに):
$ sed -E 's/^([^ ])\.com /\1.org /' file
[email protected] [email protected],[email protected]
答え2
$ awk '{ sub("\.com$", ".org", $1); print }' <file
[email protected] [email protected],[email protected]
これは、各行のスペースで区切られた最初のフィールド(のみ)でawk
一致するテキストを置き換えます。出力はスペースで区切られます。\.com$
.org
答え3
でこれを行うことができますsed
。その行の最初の単語だけに一致する正規表現を使用できます。
sed -r 's/^(\S+)\.com(\s+)/\1.org\2/'
スローモーション、変更:
- 最初から1つ以上の空白以外の文字を含むシーケンス(
^(\S+)
) .com
- 空白ではなく1つ以上のシーケンス(最後のもののみを一致させることができます
.com
)
入力する:
- 最初の非空間シーケンス
.org
- スペースの順序