小编Por*_*ine的帖子

读取文件并存储为数组而不跳过空字符串

File.tsv 是一个有 7 列的制表符分隔文件:

cat File.tsv
1   A   J               1
2   B   K   N           1
3   C   L   O   P   Q   1
Run Code Online (Sandbox Code Playgroud)

以下读取File.tsv7 列制表符分隔文件,并将条目存储在数组 A 中。

while IFS=$'\t' read -r -a D; do
    A=("${A[@]}" "${D[i]}" "${D[$((i + 1))]}" "${D[$((i + 2))]}" "${D[$((i + 3))]}" "${D[$((i + 4))]}" "${D[$((i + 5))]}" "${D[$((i + 6))]}")
done < File.tsv
nA=${#A[@]}
Run Code Online (Sandbox Code Playgroud)
while IFS=$'\t' read -r -a D; do
    A=("${A[@]}" "${D[i]}" "${D[$((i + 1))]}" "${D[$((i + 2))]}" "${D[$((i + 3))]}" "${D[$((i + 4))]}" …
Run Code Online (Sandbox Code Playgroud)

bash array csv read

4
推荐指数
1
解决办法
393
查看次数

查找 exec sh:Shell 变量未传递给 subshel​​l

这是一个简化的代码,如果它包含与父目录和.md扩展名相同的文件名,则打印目录的名称。

FIND(){
    find . -type d -exec sh -c '
        for d do
            [ -f "${d}/${d##*/}.md" ] && printf "%s\n" "$d"
        done' find-sh {} +
}


FIND
Run Code Online (Sandbox Code Playgroud)

概括地说,我想将搜索词${d}/${d##*/}.md作为参数发送给FIND函数,但不幸的是,这不会输出任何内容:

FIND(){
    local SearchTerm="${1}"
    find . -type d -exec sh -c '
        for d do
            [ -f "${SearchTerm}" ] && printf "%s\n" "$d"
        done' find-sh {} +
}

FIND '${d}/${d##*/}.md'
Run Code Online (Sandbox Code Playgroud)

我确信SearchTerm. 任何提示?


我试过了:FIND '\${d}/\${d##*/}.md'但没有输出

bash quoting function arguments

3
推荐指数
2
解决办法
301
查看次数

打印具有特定输出字段分隔符的特定列

cat A.tsv
1,a,d
2,b,e
3,c,f
Run Code Online (Sandbox Code Playgroud)
cat A.tsv
1,a,d
2,b,e
3,c,f
Run Code Online (Sandbox Code Playgroud)
  • 我预计以下 4 个命令会给出与上述相同的结果:
$ awk -F ',' -v OFS="," '{print $2, $3}' A.tsv 
a,d
b,e
c,f
Run Code Online (Sandbox Code Playgroud)
$ awk 'FS=","; OFS=","; {print $2, $3}' A.tsv 
1,a,d
1,a,d
,
2,b,e
2,b,e
b,e
3,c,f
3,c,f
c,f
Run Code Online (Sandbox Code Playgroud)
$ awk -F ',' 'OFS=","; {print $2, $3}' A.tsv 
1,a,d
a,d
2,b,e
b,e
3,c,f
c,f
Run Code Online (Sandbox Code Playgroud)
$ awk -v OFS="," 'FS=","; {print $2, $3}' A.tsv 
1,a,d
,
2,b,e
b,e
3,c,f
c,f
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么最后 4 个命令的结果与第一个不同吗?

请参阅:shell 脚本中 awk …

awk

3
推荐指数
1
解决办法
252
查看次数

查找包含特定文件的排除路径

我试图递归地查找文件夹中的所有目录,同时通过排除所有包含.git文件的路径来排除所有 git 子模块。我怎么能做到?


解释:

.git文件存在于每个子模块文件夹的根目录中。这个子模块文件夹可以包含在任何地方。


测试用例

$ mkdir Test
$ cd Test
$ mkdir a
$ mkdir b
$ mkdir c
$ cd a
$ mkdir .git
$ cd ..
$ cd b
$ touch .git
$ cd ..
$ cd c
$ mkdir c1
$ mkdir c2
$ cd..
$ find . -type d \( \( ! -name . -exec [ -e {}/.git ] \; -prune \) -o \( \( \
 -name .git\
 -o -name .vscode\ …
Run Code Online (Sandbox Code Playgroud)

directory find path git

2
推荐指数
1
解决办法
1556
查看次数

Mapfile 不删除尾随换行符

  • 示例数据:制表符分隔的 tsv 文件
a.1.58  fadado/CSV  https://github.com/fadado/CSV
a.1.63  jehiah/json2csv https://github.com/jehiah/json2csv
a.1.80  stedolan/jq https://github.com/stedolan/jq/issues/370
Run Code Online (Sandbox Code Playgroud)
  • 以下使用 fzf 选择一条记录,并将第 2 和第 3 列存储到数组 Link:
mapfile -d $'\t' -t Link < <(awk 'BEGIN{FS="\t"; OFS="\t"} {print $2,$3}' "${SessionP}" | fzf)
Run Code Online (Sandbox Code Playgroud)

问题

在上面的命令中,我使用-t了 mapfile 选项,但echo "${Link[1]}"打印了一个新的行尾!

为什么没有被淘汰?


参考

array gnu newlines fzf

2
推荐指数
1
解决办法
171
查看次数

来自“util-linux”而不是来自“bsdmainutils”的“column”

column有封装形式util-linuxbsdmainutils。这两个软件包都安装在 Linux Mint 20.2 中

$ type column
column is /usr/bin/column
column is /bin/column
Run Code Online (Sandbox Code Playgroud)

这两个列都指向 bsd 列工具。我如何从 访问该工具util-linux

util-linux linux-mint columns

2
推荐指数
1
解决办法
1262
查看次数

mktemp 在 pwd 中创建文件而不是在 /tmp 中

以前 mktemp 用于在/tmp. 今天我注意到 mktemp 正在创建文件而 $PWD不是在/tmp?

我是否无意中改变了一些东西?有什么建议来解决这个问题吗?


笔记:

我能够做到:ls /tmp

$ mktemp --version
mktemp (GNU coreutils) 8.30
Run Code Online (Sandbox Code Playgroud)
$ echo $TMPDIR

$
Run Code Online (Sandbox Code Playgroud)

gnu tmp files mktemp

1
推荐指数
1
解决办法
447
查看次数

bash 脚本中的“type”命令未显示所有路径

当我echo "${PATH}" | tr -s ':' '\n' | nl从 bash 脚本内部和终端输入时,得到相同的结果:

     1  /home/nikhil/Documents/Git/Cs/Architecture/bin
     2  /home/nikhil/.local/bin
     3  /home/nikhil/opt/.nvm/versions/node/v16.13.0/bin
     4  /home/nikhil/opt/bin
     5  /usr/local/sbin
     6  /usr/local/bin
     7  /usr/sbin
     8  /usr/bin
     9  /sbin
    10  /bin
    11  /usr/games
    12  /usr/local/games
    13  /snap/bin
    14  /home/linuxbrew/.linuxbrew/bin
    15  /home/linuxbrew/.linuxbrew/sbin
    16  /home/nikhil/.cargo/bin
    17  /home/nikhil/.cabal/bin
    18  /home/nikhil/opt/go/bin
    19  /home/nikhil/.ruby/bin
    20  /home/linuxbrew/.linuxbrew/opt/fzf/bin
Run Code Online (Sandbox Code Playgroud)

但是当我在 bash 脚本中和终端上输入以下内容时,我得到不同的结果:

# From Terminmal
$ type pandoc
pandoc is aliased to `/usr/bin/pandoc'
pandoc is /usr/bin/pandoc
pandoc is /home/linuxbrew/.linuxbrew/bin/pandoc
pandoc is /home/nikhil/.cabal/bin/pandoc
Run Code Online (Sandbox Code Playgroud)
# From Terminmal
$ …
Run Code Online (Sandbox Code Playgroud)

command-line bash path shell-script command

0
推荐指数
1
解决办法
480
查看次数

删除字符串中直到第一个字母 ([a-zA-Z]) 的所有字符

我想删除[a-zA-Z] 字符串中第一个字母之前的所有字符。例如:

#121Abc-->Abc

%Ab#c-->Ab#c

Ab#c-->Ab#c

Abc-->Abc

1Abc-->Abc

1 21Abc-->Abc

1^1 Abc-->Abc

注意:所有非字母包括非打印字符。

用bash工具可以吗?

bash sed awk text-processing tr

0
推荐指数
2
解决办法
3318
查看次数

sed 删除特定行号后的空行

我试图删除第 3 行之后的所有空行,直到文件末尾:

cat ${File}
1

2
3


4

5

5



6
7



8
9


sed -e '3,${s~^$~~g}' ${File}
1

2
3


4

5

5



6
7



8
9

Run Code Online (Sandbox Code Playgroud)

观察:输出没有变化。

期望输出

1

2
3
4
5
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)

有什么建议?

sed gnu text-processing

-1
推荐指数
2
解决办法
159
查看次数

将数组作为环境变量存储到非交互式 shell

有几个问题可以解决问题,但我想尝试以下方法:

在这个问题中,我基本上将数组作为环境变量,然后尝试将字符串存储到单独的数组元素中。

a=('Apple Tomato' 'Banana Carrot') bash -c \
'b=($(echo "${a}")); echo -e "${b[0]}\n"; echo "${b[1]}";'
Run Code Online (Sandbox Code Playgroud)

输出

(Apple

Tomato
Run Code Online (Sandbox Code Playgroud)

期望输出:

苹果番茄

香蕉胡萝卜

一个观察:

此外,如果原始数组在单引号数组元素内有双引号,是否会保留引号。例如:a=('Apple "Tomato"' 'Banana "Carrot"')

shell bash array

-1
推荐指数
1
解决办法
69
查看次数