我想从文件的开头和结尾删除空行,但不删除中间非空行之间的空行。我认为sed
或awk
将是解决方案。
来源:
1:
2:
3:line1
4:
5:line2
6:
7:
8:
Run Code Online (Sandbox Code Playgroud)
输出:
1:line1
2:
3:line2
Run Code Online (Sandbox Code Playgroud) 我想在 vim 中制作一张桌子。
制作水平线很容易
______________________________
Run Code Online (Sandbox Code Playgroud)
对于垂直我使用这个
yes "|" | head -10
Run Code Online (Sandbox Code Playgroud)
但结果很糟糕
|
|
|
|
|
|
|
|
|
Run Code Online (Sandbox Code Playgroud)
我想要像水平线这样连续的东西。我怎样才能做到这一点?
我想检查第一个命令行参数 ( $1
) 是否至少有 10 个字符,以及它是否为空。
该脚本被称为:
./myscript.sh 2018-08-14
Run Code Online (Sandbox Code Playgroud)
我试过这个,但它不起作用
timestamp="$1"
# check if command line argument is empty or not present
if [ "$1" == "" ] || [ $# -gt 1 ]; then
echo "Parameter 1 is empty"
exit 0
elif [! "${#timestamp}" -gt 10 ]; then
echo "Please enter at least a valid date"
echo "Example: 2018-08-14"
exit 0
else
echo "THIS IS THE VALID BLOCK"
fi
Run Code Online (Sandbox Code Playgroud) 如何搜索以下任意内容:
在 Linux 上查找以空格开头的文件夹,然后删除所有起始空格,以便该文件夹可以以字母或数字开头?
在 Linux 上查找以空格开头的文件,然后删除所有开头空格,以便文件可以以字母或数字开头?
POSIXwc
命令计算文件中有多少 POSIX 行。POSIX 标准将一行定义为带有后缀的文本字符串\n
。没有\n
,纯文本字符串不能称为一行。
但对我来说,计算文件中有多少行文本字符串更自然。有没有简单的方法来做到这一点?
root:[~]# printf "aa\nbb" | wc -l
1
root:[~]# printf "aa\nbb\n" | wc -l
2
root:[~]#
Run Code Online (Sandbox Code Playgroud) 目标
如何在匹配行之前删除文本文件中的所有行,包括这一行?
输入文件示例:
apple
pear
banana
HI_THERE
lemon
coconut
orange
Run Code Online (Sandbox Code Playgroud)
期望的输出:
lemon
coconut
orange
Run Code Online (Sandbox Code Playgroud)
目的是在 sed 中使用“-i”选项(直接编辑)。
清洁解决方案?
类似问题的大多数答案都提出了类似的建议:
sed -n '/HI_THERE/,$p' input_file
Run Code Online (Sandbox Code Playgroud)
但匹配的行不会被删除:
HI_THERE
lemon
coconut
orange
Run Code Online (Sandbox Code Playgroud)
然后,知道这将删除匹配行(包括它)到文件末尾的所有内容:
sed '/HI_THERE/,$d' input_file
Run Code Online (Sandbox Code Playgroud)
我试过这样的事情:
sed '^,/HI_THERE/d' input_file
Run Code Online (Sandbox Code Playgroud)
但随后 sed 抱怨:
sed: -e expression #1, char 1: unknown command: `^'
Run Code Online (Sandbox Code Playgroud)
肮脏的解决方案
最后一个(脏)解决方案是使用管道:
sed -n '/HI_THERE/,$p' input_file | tail -n +2
Run Code Online (Sandbox Code Playgroud)
但是,直接编辑文件不起作用:
sed -n '/HI_THERE/,$p' input_file | tail -n +2 > input_file
cat input_file # returns nothing
Run Code Online (Sandbox Code Playgroud)
并且必须使用这样的临时文件...
sed -n '/HI_THERE/,$p' input_file | …
Run Code Online (Sandbox Code Playgroud) 我在这里得到了这个脚本。它应该通过逐行读取文件 LineNumbers.file(每个都包含一个行号)来运行循环,然后相应地用 ./ 替换 0/0。在 BEFORE_File.txt 中。它可以工作,但它只需要文件 LineNumbers.file 的最后一行,而不是 >100 个条目。
我不确定我在这里做错了什么。你能帮我让 awk 逐行读取 LineNumbers.file 吗?
我已经可以使用它了sed -i "${line}s/0\/0/\.\/\./" "${myFileTmp}"
,但是在我拥有的 >3GB 大文件上它真的很慢。所以我认为 awk 将是一个更快的选择。
非常感谢!
cat ./LineNumbers_TEMP/LineNumbers.file | while read line
do
myFileTmp=BEFORE_File.txt
awk -v var=${line} 'FNR==var { sub(/0\/0/, "\.\/\."); print }' "${myFileTmp}" > AFTER_File.txt
done
Run Code Online (Sandbox Code Playgroud)
例如,这是文件的样子:
cat ./LineNumbers_TEMP/LineNumbers.file
1
2
5
Run Code Online (Sandbox Code Playgroud)
脚本前的文件.txt:
cat BEFORE_File.txt
0/0
0/0
0/1
0/1
0/0
0/0
0/0
Run Code Online (Sandbox Code Playgroud)
这是运行脚本后文件的外观:
cat AFTER_File.txt
./.
./.
0/1
0/1
./.
0/0
0/0
Run Code Online (Sandbox Code Playgroud)
目前我只得到这个:
./.
Run Code Online (Sandbox Code Playgroud) 当我用来diff -y
比较两个具有长行文本的文本文件时,结果会截断每一列,并且我无法读取整行。我希望文本能够换行(或折叠,也称为折叠),以便我可以阅读整行。
例如,假设我有两个简单的文本文件,每行一行:
cat tmp.txt tmp2.txt
The quick brown fox jumped over the lazy dog. This line is very long and will not show when I use a diff.
The quick brown fox did not jump over the lazy dog. This line is very long and will not show when I use a diff.
Run Code Online (Sandbox Code Playgroud)
diff
我得到了他们,
diff -y tmp.txt tmp2.txt
The quick brown fox jumped over the lazy dog. This line is ve | The quick brown fox …
Run Code Online (Sandbox Code Playgroud) 假设我在 Linux 和 Windows 上有相同的 ASCII 文本文件:
one
two
three
Run Code Online (Sandbox Code Playgroud)
这两个文件在两个操作系统上将分别具有\n
和\r\n
作为 EOL 字符。
这是否意味着Linux上的文件更小?
这个在 linux 上执行的测试似乎是肯定的:
$ echo -en 'one\ntwo\nthree\n' | wc --bytes
14
$ echo -en 'one\r\ntwo\r\nthree\r\n' | wc --bytes
17
Run Code Online (Sandbox Code Playgroud)