変更する必要があるさまざまなテキストファイルがあります。
test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat|...
次のように、パイプライン処理を含む「test5232.lop」削除プロセスを自動化しようとしています。
test.xyz|test3.abc|filename.test|file.text|qwerty.bat|...
可能であれば、一時ファイルを生成する必要はありません。
答え1
これは職業のようですcut
。区切り文字があり|
、保持するフィールド(--complement
)ではなく削除するフィールドを指定し、フィールド3(この場合は削除しようとしている)を選択しようとしています。
パスワード:
cut -d '|' --complement -f 3
テスト:
$ echo 'test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat|x' | cut -d '|' --complement -f 3
test.xyz|test3.abc|filename.test|file.text|qwerty.bat|x
答え2
ちょうどSedを使用してください:
sed 's/|test5232\.lop//' file.txt
説明を要求する前に元の答え:
POSIX機能のみを使用してください。横:
sed 's/|[^|]*//2' file.txt
すべての行に少なくとも3つの|
記号があることがわかっている場合は、より直感的な形式を使用できます。
sed 's/[^|]*|//3' file.txt
答え3
3番目のフィールド(「フィールド」は、「パイプを除くすべて、0回以上、後にパイプが来る」)を別のものに置き換えるには、次のようにします。
awk '{$0=gensub(/[^|]*\|/, "", 3); print $0}' input
明らかに、行のどこからでも「test5232.lop」を削除したいと思います。
sed -i 's/|test5232\.lop//' input
sed -i
(一時ファイルの作成を含むすべてのソリューションがありますが)
答え4
また、このawkの簡単な解決策を確認してください。文字列はどこにでも削除され、移植可能でなければなりません。
$ a="test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat"
$ awk -F"test5232.lop." '{printf("%s%s\n",$1,$2)}' <<<"$a"
test.xyz|test3.abc|filename.test|file.text|qwerty.bat
内部編集要求に関しては、GNU AWKバージョン> 4.1も次のように動作できます。友達マニュアル:
awk -i inplace -v INPLACE_SUFFIX=.bak '{...}'
ただし、いかなる場合でも、awk、sed、およびPerlは真の内部編集を達成できません。 GNUsed
情報ページでは、この問題を明確に説明しています。
'-i[SUFFIX]'
'--in-place[=SUFFIX]'
This option specifies that files are to be edited in-place. GNU
'sed' does this by creating a temporary file and sending output to
this file rather than to the standard output.(1).
つまり、最後に次のような内容を追加することで、ここでどんなソリューションでも使用できます。
awk/sed/perl/whatever oldfile >tmpfile && mvtmpfile oldfile && rm -f tmpfile