シェル変数に格納されている行番号を使用して行を印刷するには、sedを使用します。

シェル変数に格納されている行番号を使用して行を印刷するには、sedを使用します。

行番号を含む列を抽出するタブファイルがあり、他のファイルから行を抽出する必要があります。私は行番号を取得してcut -f変数に保存しましたlist。私はsed以下を試してみました。

$ list="2 5 7 10"
$ echo $list
2 5 7 10
$ sed -n "$list p" longText.txt 
sed: -e expression #1, char 3: unknown command: `5'
$ sed -n "${list}p" longText.txt 
sed: -e expression #1, char 3: unknown command: `5'

エラーは何ですか?正しい構文は何ですか?

ベストアンサー1

sedコードの問題は、次のようなものを実行しようとしていることです。

2 5 7 10p

これは明らかに言葉にならないのでsed文句です。

問題の一部は、単一の文字列を使用してさまざまな項目(行番号)を保持することです。これを行うには、配列を使用するのが最善です。その後、各配列要素(行番号)をpその後に挿入して別々のコマンドにする必要がありますsed

数字2、5、7、10の場合、sed次のスクリプトが必要です。

2p; 5p; 7p; 10p;

または

2p;5p;7p;10p;

または

2p
5p
7p
10p

次の配列からこれらのスクリプトを簡単に作成できますbash

lines=( 2 5 7 10 )
printf '%sp\n' "${lines[@]:-"q;"}" | sed -n -f /dev/stdin longText.txt

printfこれは、数値リストからスクリプトを生成し、それを標準入力から読み取ってファイルに適用するスクリプトに供給するために使用されます。sedsed-f /dev/stdin

リストが空の場合は、何もせずに終了するprintf式がエクスポートされます。sedsed


もしあなたなら必要文字列の数値を使用するには、その文字列を有効なsedスクリプトに変換し、次のようにファイルに適用できます。

sed 's/[[:digit:]]\{1,\}/&p;/g' <<<"$list" | sed -n -f /dev/stdin longText.txt

文字列が与えられると、上記と同様にファイルに適用されるスクリプトが2 5 7 10生成されます。sed2p; 5p; 7p; 10p;

リストが空の場合はsed何も出力されません。

おすすめ記事