[過去ログ] くだらねえ質問はここに書き込め!Part 252 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
714: 02/19(水)21:04 ID:a53RgKIf(1) AAS
uBO止めるの近いのか
糞ブラウザやな
715
(1): 02/22(土)05:45 ID:3627kT9B(1) AAS
$ cat foo.txt
a
b
c
$ IGNORE=a
$ sed -r "/$IGNORE/d" foo.txt
b
c
$ IGNORE='a
b'
省3
716
(2): 02/22(土)06:25 ID:GjI6qq7H(1) AAS
\n
使えるでしょ
記述する場所によっては\\nとエスケープしないと
717: 02/22(土)07:53 ID:m1M48Hvs(1) AAS
そのまんまChatGPT先生に聞いたら、
sed では、改行を含むパターンを直接扱うことができません。
Perl を使うと、改行を含むパターンもそのまま扱えます。

$ IGNORE=$(echo -e "a\nb")
$ perl -0777 -ne "print unless /$IGNORE/" foo.txt

718: 02/22(土)08:48 ID:vqb2q0Lx(1/5) AAS
>>715
別なセンセーに聞いてみた

sed で改行を含む変数を扱うには、いくつかの方法があります。
1. sed の -z オプションを使う
sed の -z オプションを使うと、ファイルを 1 つの行として読み込むことができます。この方法を使うと、改行を含む文字列を 1 つのパターンとして扱うことができます。
IGNORE='a
b'
sed -z "s/$IGNORE//g" foo.txt

2. tr コマンドで改行を別の文字に変換する
tr コマンドを使って、改行を別の文字(例えば、#)に変換し、sed で処理した後、再び改行に戻す方法です。
省16
719: 02/22(土)08:49 ID:vqb2q0Lx(2/5) AAS
これらの方法の中から、あなたの目的に合ったものを選んでください。
補足
* 変数 $IGNORE に改行が含まれている場合、ダブルクォートで囲む必要があります。
* sed の -r オプションは、拡張正規表現を使うためのオプションです。今回のケースでは、-r オプションは必須ではありません。
720: 02/22(土)08:55 ID:vqb2q0Lx(3/5) AAS
中国のセンセーに聞いてみた

改行を含む変数をsedで扱う場合、sedのアドレス指定が行ベースであるため直接使用できません。代わりに、以下の方法で回避できます。

**方法1: awkを使用する**
```bash
awk -v ignore="$IGNORE" 'BEGIN{split(ignore,a,"\n");for(i in a)s[a[i]]} !($0 in s)' foo.txt
```

**方法2: パターンをOR条件で結合**
```bash
# 改行をエスケープしてOR条件(|)に変換
IGNORE_ESC=$(printf "%s" "$IGNORE" | sed 's/^/\^/;s/$/\$/;H;1h;$!d;x;y/\n/|/')
省15
721: 02/22(土)08:56 ID:vqb2q0Lx(4/5) AAS
**ポイント**
- awkでは改行区切りの変数を連想配列に変換して効率的に処理

- sedを使う場合、改行をOR条件に変換して単一の正規表現を構築

- シェルのパラメータ展開やsedの置換でパターンを加工する必要あり

- 行全体マッチを厳密にするため`^`と`$`を付与

特にawkを使う方法が、可読性・メンテナンス性・パフォーマンスのバランスが取れています。
sedで処理したい特殊な事情がない限り、awkの使用をお勧めします。
722: 02/22(土)08:59 ID:vqb2q0Lx(5/5) AAS
小操縦士センセーに聞いてみた

改行を含む変数を`sed`で扱うには、改行を特別な文字として扱う必要があります。以下はその方法の一例です:

1. **変数`IGNORE`の定義**:
```sh
IGNORE=$(printf "a\nb")
```

2. **`sed`コマンドの使用**:
```sh
sed "/$IGNORE/d" foo.txt
```
省13
723
(1): 02/22(土)11:54 ID:5VChmkgc(1) AAS
ただコピペしてるだけの脳死馬鹿
724: 02/22(土)14:07 ID:6p21T8kC(1) AAS
>>723
何も提案すら出来ないバカ
725: 02/22(土)14:38 ID:N63R+4zc(1/2) AAS
同じ馬鹿なら脳死していない分、提案できない方がマシであると、褒めたのだろうか。解釈の難しい罵り合いだ。
726
(1): 02/22(土)14:42 ID:QVpTxt80(1/2) AAS
>>716で終了なんだからこのAIのやりとり全部無駄なんだよなあ
727
(1): 02/22(土)15:00 ID:N63R+4zc(2/2) AAS
>>726
>>716 って実現できるのか。オレがやってみると上手くいかないが。

$ echo =${IGNORE}=
=a\nb=
$ echo -e 'a\nb\nc' | sed -r "/$IGNORE/d"
a
b
c
$
728
(1): 02/22(土)15:04 ID:FMPHBdk9(1) AAS
ユーザー入力をちゃんとエスケープ処理してないアプリあるよな
入力に " や ' を絡めるとエラー吐いて
簡単にインジェクション攻撃通るんじゃないのみたいな
729
(1): 02/22(土)16:22 ID:QVpTxt80(2/2) AAS
>>727
あーうんすまんsedだと行が単位になるから\nにマッチさせるにはオプションが要るわ…
730: 02/22(土)16:42 ID:JwWVW3Hg(1) AAS
>>728
エスケープすべきはアプリを呼び出す側だろ
731
(1): 02/22(土)22:52 ID:ApqRBxV4(1) AAS
>>729
エスケープを知っているレベルの人なら
sedは行単位処理や-zオプションは当然知っているだろうからな
732
(1): 02/23(日)02:36 ID:aeSP9yBb(1) AAS
実はgrepでいいのは内緒
$ grep -v "$IGNORE" foo.txt
c
sedでやりたい場合もあるから無視はできんが
xargsで引用符消えたり課題は尽きないわ
733: 02/23(日)08:12 ID:tnH6LTqV(1) AAS
>>732
それは質問の主旨である

> sedで改行を含む変数を扱うにはどうすれば?

を満たさない。主旨の一例の解となるだけ。>>731 が回答足り得そうなので、悪いが蛇足。

$ echo "[${IGNORE}]"
[a\nb]
$ echo -e 'a\nb\nc' | sed -z "s/${IGNORE}//"

c
$
1-
あと 269 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.024s